fixed .value vs attr(value) access

This commit is contained in:
Misko Hevery 2010-03-24 16:47:11 -07:00
parent 0c42eb9909
commit f29f6a47c4
4 changed files with 49 additions and 18 deletions

View file

@ -44,7 +44,6 @@ function extensionList(angular, name) {
}
var consoleNode, msie,
VALUE = 'value',
NOOP = 'noop',
jQuery = window['jQuery'] || window['$'], // weirdness to make IE happy
slice = Array.prototype.slice,

View file

@ -179,6 +179,13 @@ JQLite.prototype = {
return this[0].textContent;
},
val: function(value) {
if (isDefined(value)) {
this[0].value = value;
}
return this[0].value;
},
html: function(value) {
if (isDefined(value)) {
this[0].innerHTML = value;

View file

@ -36,23 +36,22 @@ function domAccessor(element) {
return value;
}
return {
get: function(){
return validate(element.attr(VALUE));
},
set: function(value){
element.attr(VALUE, validate(value));
}
get: function(){ return validate(element.val()); },
set: function(value){ element.val(validate(value)); }
};
}
var NG_ERROR = 'ng-error',
NG_VALIDATION_ERROR = 'ng-validation-error',
TEXT_META = ['', 'keyup change'],
INPUT_META = {
'text': ["", 'keyup change']
};
'text': TEXT_META,
'textarea': TEXT_META,
'hidden': TEXT_META,
'password': TEXT_META
};
angularWidget('INPUT', function input(element){
var meta = INPUT_META[lowercase(element.attr('type'))];
function inputWidget(meta) {
return meta ? function(element) {
var scope = scopeAccessor(this, element),
dom = domAccessor(element);
@ -62,6 +61,14 @@ angularWidget('INPUT', function input(element){
});
this.$watch(scope.get, dom.set);
} : 0;
}
angularWidget('INPUT', function input(element){
return inputWidget(INPUT_META[lowercase(element[0].type)]);
});
angularWidget('TEXTAREA', function(){
return inputWidget(INPUT_META['text']);
});

View file

@ -25,13 +25,13 @@ describe("input widget", function(){
scope.set('name', 'Adam');
scope.updateView();
expect(element.attr('value')).toEqual("Adam");
expect(element.val()).toEqual("Adam");
element.attr('value', 'Shyam');
element.val('Shyam');
element.trigger('keyup');
expect(scope.get('name')).toEqual('Shyam');
element.attr('value', 'Kai');
element.val('Kai');
element.trigger('change');
expect(scope.get('name')).toEqual('Kai');
});
@ -42,9 +42,9 @@ describe("input widget", function(){
scope.set('list', ['x', 'y', 'z']);
scope.updateView();
expect(element.attr('value')).toEqual("x, y, z");
expect(element.val()).toEqual("x, y, z");
element.attr('value', '1, 2, 3');
element.val('1, 2, 3');
element.trigger('keyup');
expect(scope.get('list')).toEqual(['1', '2', '3']);
});
@ -59,7 +59,7 @@ describe("input widget", function(){
expect(element.hasClass('ng-validation-error')).toBeFalsy();
expect(element.attr('ng-error')).toBeFalsy();
element.attr('value', 'x');
element.val('x');
element.trigger('keyup');
expect(element.hasClass('ng-validation-error')).toBeTruthy();
expect(element.attr('ng-error')).toEqual('Not a number');
@ -75,10 +75,28 @@ describe("input widget", function(){
expect(element.hasClass('ng-validation-error')).toBeFalsy();
expect(element.attr('ng-error')).toBeFalsy();
element.attr('value', '');
element.val('');
element.trigger('keyup');
expect(element.hasClass('ng-validation-error')).toBeTruthy();
expect(element.attr('ng-error')).toEqual('Required');
});
it("should process ng-required", function() {
compile('<textarea name="name">Misko</textarea>');
expect(scope.get('name')).toEqual("Misko");
scope.set('name', 'Adam');
scope.updateView();
expect(element.val()).toEqual("Adam");
element.val('Shyam');
element.trigger('keyup');
expect(scope.get('name')).toEqual('Shyam');
element.val('Kai');
element.trigger('change');
expect(scope.get('name')).toEqual('Kai');
});
});