input select-multiple now works

This commit is contained in:
Misko Hevery 2010-03-25 14:51:42 -07:00
parent 4fa166866b
commit 0cc9b07320
2 changed files with 36 additions and 6 deletions

View file

@ -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(){

View file

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