aboutsummaryrefslogtreecommitdiffstats
path: root/src/widget/input.js
diff options
context:
space:
mode:
authorMisko Hevery2011-10-20 11:06:06 -0700
committerIgor Minar2011-10-20 11:30:40 -0700
commit7fc18b263dc74f52bb677e446f23e35d64948841 (patch)
tree7e0bafb9966c17e5306387ca9fc1028cb7b1111b /src/widget/input.js
parentfabc9f77a3fae10c2b8d9a9ad1541e827cc0390d (diff)
downloadangular.js-7fc18b263dc74f52bb677e446f23e35d64948841.tar.bz2
fix(radio): allows data-binding on value property. Closes#316
Diffstat (limited to 'src/widget/input.js')
-rw-r--r--src/widget/input.js30
1 files changed, 16 insertions, 14 deletions
diff --git a/src/widget/input.js b/src/widget/input.js
index 0defd234..cf29d0f1 100644
--- a/src/widget/input.js
+++ b/src/widget/input.js
@@ -546,25 +546,24 @@ angularInputType('checkbox', function(inputElement) {
</doc:example>
*/
angularInputType('radio', function(inputElement) {
- var widget = this,
- value = inputElement.attr('value');
+ var widget = this;
//correct the name
inputElement.attr('name', widget.$id + '@' + inputElement.attr('name'));
inputElement.bind('click', function() {
widget.$apply(function() {
if (inputElement[0].checked) {
- widget.$emit('$viewChange', value);
+ widget.$emit('$viewChange', widget.$value);
}
});
});
widget.$render = function() {
- inputElement[0].checked = value == widget.$viewValue;
+ inputElement[0].checked = isDefined(widget.$value) && (widget.$value == widget.$viewValue);
};
if (inputElement[0].checked) {
- widget.$viewValue = value;
+ widget.$viewValue = widget.$value;
}
});
@@ -735,7 +734,7 @@ angularWidget('input', function(inputElement){
pattern = new RegExp(pattern.substr(1, pattern.length - 2));
patternMatch = function(value) {
return pattern.test(value);
- }
+ };
} else {
patternMatch = function(value) {
var patternObj = modelScope.$eval(pattern);
@@ -743,7 +742,7 @@ angularWidget('input', function(inputElement){
throw new Error('Expected ' + pattern + ' to be a RegExp but was ' + patternObj);
}
return patternObj.test(value);
- }
+ };
}
}
@@ -771,6 +770,7 @@ angularWidget('input', function(inputElement){
controller: TypeController,
controllerArgs: [inputElement]});
+ watchElementProperty(this, widget, 'value', inputElement);
watchElementProperty(this, widget, 'required', inputElement);
watchElementProperty(this, widget, 'readonly', inputElement);
watchElementProperty(this, widget, 'disabled', inputElement);
@@ -864,15 +864,17 @@ angularWidget('textarea', angularWidget('input'));
function watchElementProperty(modelScope, widget, name, element) {
var bindAttr = fromJson(element.attr('ng:bind-attr') || '{}'),
- match = /\s*{{(.*)}}\s*/.exec(bindAttr[name]);
- widget['$' + name] =
- // some browsers return true some '' when required is set without value.
- isString(element.prop(name)) || !!element.prop(name) ||
- // this is needed for ie9, since it will treat boolean attributes as false
- !!element[0].attributes[name];
+ match = /\s*{{(.*)}}\s*/.exec(bindAttr[name]),
+ isBoolean = BOOLEAN_ATTR[name];
+ widget['$' + name] = isBoolean
+ ? ( // some browsers return true some '' when required is set without value.
+ isString(element.prop(name)) || !!element.prop(name) ||
+ // this is needed for ie9, since it will treat boolean attributes as false
+ !!element[0].attributes[name])
+ : element.attr(name);
if (bindAttr[name] && match) {
modelScope.$watch(match[1], function(scope, value){
- widget['$' + name] = !!value;
+ widget['$' + name] = isBoolean ? !!value : value;
widget.$emit('$validate');
});
}