Binding inputs to an array of primitives using ngRepeat => uneditable inputs
angularjs, angularjs-ng-repeat, angularjs-scope
Solution
Can anyone explain to me why are the inputs uneditable/readonly? If it's by design, what's the rationale behind?
It is by design, as of Angular 1.0.3. Artem has a very good explanation of how 1.0.3+ works when you "bind to each ng-repeat item directly" – i.e.,
<div ng-repeat="num in myNumbers">
<input type="text" ng-model="num">
When your page initially renders, here's a picture of your scopes (I removed one of the array elements, so the picture would have fewer boxes):
(click to enlarge)
Dashed lines show prototypical scope inheritance. Gray lines show child → parent relationships (i.e., what `$parent` references). Brown lines show $$nextSibling. Gray boxes are primitive values. Blue boxes are arrays. Purple are objects.
Note that the SO answer of mine that you referenced in a comment was written before 1.0.3 came out. Before 1.0.3, the `num` values in the ngRepeat child scopes would actually change when you typed into the text boxes. (These values would not be visible in the parent scope.) Since 1.0.3, ngRepeat now replaces the ngRepeat scope `num` values with the (unchanged) values from the parent/MainCtrl scope's `myNumbers` array during a digest cycle. This essentially makes the inputs uneditable.
The fix is to use an array of objects in your MainCtrl:
$scope.myNumbers = [ {value: 10}, {value: 20} ];
and then bind to the `value` property of the object in the ngRepeat:
<div ng-repeat="num in myNumbers">
<input type="text" ng-model="num.value">
<div>current scope: {{num.value}}</div>
Problem
Here is a demo to my problem. ``` $scope.myNumbers = [10, 20, 30]; <div ng-repeat="num in myNumbers"> <input type="text" ng-model="num"> <div>current scope: {{num}}</div> </div> ``` Can anyone explain to me why are the inputs uneditable/readonly? If it's by design, what's the rationale behind? UPDATE 2/20/2014 It looks like this is no longer an issue for v1.2.0+ Demo. But do keep in mind that although the user controls are now editable with the newer angularJS versions, it is the `num` property in the child scopes, not the parent scope, that get modified. In another words, modifying the values in the user controls does not affect the `myNumbers` array.