aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets2.js26
-rw-r--r--test/widgetsSpec.js16
2 files changed, 36 insertions, 6 deletions
diff --git a/src/widgets2.js b/src/widgets2.js
index a8d17105..c4b39bc1 100644
--- a/src/widgets2.js
+++ b/src/widgets2.js
@@ -57,6 +57,26 @@ function radioAccessor(element) {
};
}
+function optionsAccessor(element) {
+ var options = element[0].options;
+ return {
+ get: function(){
+ var values = [];
+ foreach(options, function(option){
+ if (option.selected) values.push(option.value);
+ });
+ return values;
+ },
+ set: function(values){
+ var keys = {};
+ foreach(values, function(value){ keys[value] = true; });
+ foreach(options, function(option){
+ option.selected = keys[option.value];
+ });
+ }
+ };
+}
+
function noopAccessor() { return { get: noop, set: noop }; }
var NG_ERROR = 'ng-error',
@@ -74,8 +94,8 @@ var NG_ERROR = 'ng-error',
'image': buttonWidget,
'checkbox': inputWidget('click', modelAccessor, checkedAccessor, false),
'radio': inputWidget('click', modelAccessor, radioAccessor, undefined),
- 'select-one': inputWidget('click', modelAccessor, valueAccessor, null)
-// 'select-multiple': [[], 'change'],
+ 'select-one': inputWidget('click', modelAccessor, valueAccessor, null),
+ 'select-multiple': inputWidget('click', modelAccessor, optionsAccessor, [])
// 'file': [{}, 'click']
};
@@ -85,7 +105,7 @@ function inputWidget(events, modelAccessor, viewAccessor, initValue) {
model = modelAccessor(scope, element),
view = viewAccessor(element),
action = element.attr('ng-action') || '',
- value = view.get() || initValue;
+ value = view.get() || copy(initValue);
if (isDefined(value)) model.set(value);
this.$eval(element.attr('ng-init')||'');
element.bind(events, function(){
diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js
index 9471a718..0f416278 100644
--- a/test/widgetsSpec.js
+++ b/test/widgetsSpec.js
@@ -148,14 +148,12 @@ describe("input widget", function(){
expect(model.clicked).toEqual(1);
});
- it('should type="radio"', function(){
+ it('should type="select-one"', function(){
compile(
'<select name="selection">' +
'<option>A</option>' +
'<option selected>B</option>' +
'</select>');
- expect(element[0].selectedIndex).toEqual(1);
- expect(element[0].value).toEqual('B');
expect(model.selection).toEqual('B');
model.selection = 'A';
model.$updateView();
@@ -163,6 +161,18 @@ describe("input widget", function(){
expect(element[0].childNodes[0].selected).toEqual(true);
});
+ it('should type="select-multiple"', function(){
+ compile(
+ '<select name="selection" multiple>' +
+ '<option>A</option>' +
+ '<option selected>B</option>' +
+ '</select>');
+ expect(model.selection).toEqual(['B']);
+ model.selection = ['A'];
+ model.$updateView();
+ expect(element[0].childNodes[0].selected).toEqual(true);
+ });
+
it('should report error on missing field', function(){
});