mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-17 07:40:22 +00:00
input select-multiple now works
This commit is contained in:
parent
4fa166866b
commit
0cc9b07320
2 changed files with 36 additions and 6 deletions
|
|
@ -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(){
|
||||
|
|
|
|||
|
|
@ -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(){
|
||||
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in a new issue