aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ng/directive/input.js12
-rw-r--r--test/ng/directive/inputSpec.js44
2 files changed, 51 insertions, 5 deletions
diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js
index 250a4520..dadf07c4 100644
--- a/src/ng/directive/input.js
+++ b/src/ng/directive/input.js
@@ -576,8 +576,10 @@ function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
}
function radioInputType(scope, element, attr, ctrl) {
- // correct the name
- element.attr('name', attr.id + '@' + attr.name);
+ // make the name unique, if not defined
+ if (isUndefined(attr.name)) {
+ element.attr('name', nextUid());
+ }
element.bind('click', function() {
if (element[0].checked) {
@@ -1144,9 +1146,9 @@ var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/;
var ngValueDirective = [function() {
return {
priority: 100,
- compile: function(tpl, attr) {
- if (CONSTANT_VALUE_REGEXP.test(attr.ngValue)) {
- return function(scope) {
+ compile: function(tpl, tplAttr) {
+ if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {
+ return function(scope, elm, attr) {
attr.$set('value', scope.$eval(attr.ngValue));
};
} else {
diff --git a/test/ng/directive/inputSpec.js b/test/ng/directive/inputSpec.js
index 9f8b21c4..6cecf125 100644
--- a/test/ng/directive/inputSpec.js
+++ b/test/ng/directive/inputSpec.js
@@ -1106,5 +1106,49 @@ describe('input', function() {
browserTrigger(inputElm.eq(1), 'click');
expect(scope.selected).toBe(2);
});
+
+
+ it('should work inside ngRepeat with primitive values', function() {
+ compileInput(
+ '<div ng-repeat="i in items">' +
+ '<input type="radio" name="sel_{{i.id}}" ng-model="i.selected" ng-value="true">' +
+ '<input type="radio" name="sel_{{i.id}}" ng-model="i.selected" ng-value="false">' +
+ '</div>');
+
+ scope.$apply(function() {
+ scope.items = [{id: 1, selected: true}, {id: 2, selected: false}];
+ });
+
+ inputElm = formElm.find('input');
+ expect(inputElm[0].checked).toBe(true);
+ expect(inputElm[1].checked).toBe(false);
+ expect(inputElm[2].checked).toBe(false);
+ expect(inputElm[3].checked).toBe(true);
+
+ browserTrigger(inputElm.eq(1), 'click');
+ expect(scope.items[0].selected).toBe(false);
+ });
+
+
+ it('should work inside ngRepeat without name attribute', function() {
+ compileInput(
+ '<div ng-repeat="i in items">' +
+ '<input type="radio" ng-model="i.selected" ng-value="true">' +
+ '<input type="radio" ng-model="i.selected" ng-value="false">' +
+ '</div>');
+
+ scope.$apply(function() {
+ scope.items = [{id: 1, selected: true}, {id: 2, selected: false}];
+ });
+
+ inputElm = formElm.find('input');
+ expect(inputElm[0].checked).toBe(true);
+ expect(inputElm[1].checked).toBe(false);
+ expect(inputElm[2].checked).toBe(false);
+ expect(inputElm[3].checked).toBe(true);
+
+ browserTrigger(inputElm.eq(1), 'click');
+ expect(scope.items[0].selected).toBe(false);
+ });
});
});