Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 93d6286

Browse files
committed
fix(input.radio): support 2-way binding in a repeater
Closes #869
1 parent 5bcd719 commit 93d6286

File tree

2 files changed

+51
-5
lines changed

2 files changed

+51
-5
lines changed

src/ng/directive/input.js

+7-5
Original file line numberDiff line numberDiff line change
@@ -576,8 +576,10 @@ function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
576576
}
577577

578578
function radioInputType(scope, element, attr, ctrl) {
579-
// correct the name
580-
element.attr('name', attr.id + '@' + attr.name);
579+
// make the name unique, if not defined
580+
if (isUndefined(attr.name)) {
581+
element.attr('name', nextUid());
582+
}
581583

582584
element.bind('click', function() {
583585
if (element[0].checked) {
@@ -1144,9 +1146,9 @@ var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/;
11441146
var ngValueDirective = [function() {
11451147
return {
11461148
priority: 100,
1147-
compile: function(tpl, attr) {
1148-
if (CONSTANT_VALUE_REGEXP.test(attr.ngValue)) {
1149-
return function(scope) {
1149+
compile: function(tpl, tplAttr) {
1150+
if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {
1151+
return function(scope, elm, attr) {
11501152
attr.$set('value', scope.$eval(attr.ngValue));
11511153
};
11521154
} else {

test/ng/directive/inputSpec.js

+44
Original file line numberDiff line numberDiff line change
@@ -1106,5 +1106,49 @@ describe('input', function() {
11061106
browserTrigger(inputElm.eq(1), 'click');
11071107
expect(scope.selected).toBe(2);
11081108
});
1109+
1110+
1111+
it('should work inside ngRepeat with primitive values', function() {
1112+
compileInput(
1113+
'<div ng-repeat="i in items">' +
1114+
'<input type="radio" name="sel_{{i.id}}" ng-model="i.selected" ng-value="true">' +
1115+
'<input type="radio" name="sel_{{i.id}}" ng-model="i.selected" ng-value="false">' +
1116+
'</div>');
1117+
1118+
scope.$apply(function() {
1119+
scope.items = [{id: 1, selected: true}, {id: 2, selected: false}];
1120+
});
1121+
1122+
inputElm = formElm.find('input');
1123+
expect(inputElm[0].checked).toBe(true);
1124+
expect(inputElm[1].checked).toBe(false);
1125+
expect(inputElm[2].checked).toBe(false);
1126+
expect(inputElm[3].checked).toBe(true);
1127+
1128+
browserTrigger(inputElm.eq(1), 'click');
1129+
expect(scope.items[0].selected).toBe(false);
1130+
});
1131+
1132+
1133+
it('should work inside ngRepeat without name attribute', function() {
1134+
compileInput(
1135+
'<div ng-repeat="i in items">' +
1136+
'<input type="radio" ng-model="i.selected" ng-value="true">' +
1137+
'<input type="radio" ng-model="i.selected" ng-value="false">' +
1138+
'</div>');
1139+
1140+
scope.$apply(function() {
1141+
scope.items = [{id: 1, selected: true}, {id: 2, selected: false}];
1142+
});
1143+
1144+
inputElm = formElm.find('input');
1145+
expect(inputElm[0].checked).toBe(true);
1146+
expect(inputElm[1].checked).toBe(false);
1147+
expect(inputElm[2].checked).toBe(false);
1148+
expect(inputElm[3].checked).toBe(true);
1149+
1150+
browserTrigger(inputElm.eq(1), 'click');
1151+
expect(scope.items[0].selected).toBe(false);
1152+
});
11091153
});
11101154
});

0 commit comments

Comments
 (0)