diff options
| author | Misko Hevery | 2010-03-25 14:51:42 -0700 |
|---|---|---|
| committer | Misko Hevery | 2010-03-25 14:51:42 -0700 |
| commit | 0cc9b0732003451537a5bfc444fb6590f4ed103a (patch) | |
| tree | 214e0b16d1b4f7b85f803aa5e5eedc4933e6e298 | |
| parent | 4fa166866b97d4f4dbd21514dbd674347da0a109 (diff) | |
| download | angular.js-0cc9b0732003451537a5bfc444fb6590f4ed103a.tar.bz2 | |
input select-multiple now works
| -rw-r--r-- | src/widgets2.js | 26 | ||||
| -rw-r--r-- | test/widgetsSpec.js | 16 |
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(){ }); |
