diff options
| -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(){    });  | 
