From f3456dc2826e9570cf2969fab3c314255d16188f Mon Sep 17 00:00:00 2001
From: Misko Hevery
Date: Thu, 7 Jul 2011 13:56:13 -0700
Subject: fix(directive): ng:options now support binding to expression
Closes #449
---
src/widgets.js | 76 ++++++++++++++++++++++++++++++++++------------------------
1 file changed, 45 insertions(+), 31 deletions(-)
(limited to 'src')
diff --git a/src/widgets.js b/src/widgets.js
index 47869535..8fa8db4a 100644
--- a/src/widgets.js
+++ b/src/widgets.js
@@ -596,12 +596,14 @@ angularWidget('button', inputWidgetSelector);
* * binding to a value not in list confuses most browsers.
*
* @element select
- * @param {comprehension_expression} comprehension _expresion_ `for` _item_ `in` _array_.
+ * @param {comprehension_expression} comprehension _select_ `as` _label_ `for` _item_ `in` _array_.
*
* * _array_: an expression which evaluates to an array of objects to bind.
* * _item_: local variable which will refer to the item in the _array_ during the iteration
- * * _expression_: The result of this expression will be `option` label. The
- * `expression` most likely refers to the _item_ variable.
+ * * _select_: The result of this expression will be assigned to the scope.
+ * The _select_ can be ommited, in which case the _item_ itself will be assigned.
+ * * _label_: The result of this expression will be the `option` label. The
+ * `expression` most likely reffers to the _item_ variable. (optional)
*
* @example
@@ -657,7 +659,7 @@ angularWidget('button', inputWidgetSelector);
*/
-var NG_OPTIONS_REGEXP = /^(.*)\s+for\s+([\$\w][\$\w\d]*)\s+in\s+(.*)$/;
+var NG_OPTIONS_REGEXP = /^\s*((.*)\s+as\s+)?(.*)\s+for\s+([\$\w][\$\w\d]*)\s+in\s+(.*)$/;
angularWidget('select', function(element){
this.descend(true);
this.directives(true);
@@ -669,12 +671,13 @@ angularWidget('select', function(element){
}
if (! (match = expression.match(NG_OPTIONS_REGEXP))) {
throw Error(
- "Expected ng:options in form of '_expresion_ for _item_ in _collection_' but got '" +
+ "Expected ng:options in form of '(_expression_ as)? _expresion_ for _item_ in _collection_' but got '" +
expression + "'.");
}
- var displayFn = expressionCompile(match[1]).fnSelf;
- var itemName = match[2];
- var collectionFn = expressionCompile(match[3]).fnSelf;
+ var displayFn = expressionCompile(match[3]).fnSelf;
+ var itemName = match[4];
+ var itemFn = expressionCompile(match[2] || itemName).fnSelf;
+ var collectionFn = expressionCompile(match[5]).fnSelf;
// we can't just jqLite('