You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Apr 12, 2024. It is now read-only.
If the above is displayed in a series of input fields, changes to the content are not reflected in the model. However, binding the above using code like the following does maintain binding to the model:
<div ng-repeat="value in model.values">
<input type="text" ng-model="model.values[$index]" />
</div>
<div ng-repeat="value in model.values">
<input type="text" ng-model="value" />
</div>
this will not work since you are binding to a scope. Basically you have to have a . in ng-model or the revers data binding does not work on primitives.
so this is basically expected because you are binding to a scope.value property not to the original value in the repeater.
The flicker is also expected with your workaround since data binding changes the array, which then makes it look like to the repeater as if Value 1 left and new Value 2X appeared, so the repeater removes the old DOM node and replaces it with a new DOM node hence the loss of focus.
I know this is counter intuitive, but that is how the system is architected. Don't bind to primitives is my answer.
The solution given here says, "you have to have a . in ng-model." You did not do this. Yours is ng-model="field".
You need to restructure your data so that you have an array of objects not strings.
Here is a fixed fiddle: http://jsfiddle.net/7KrQ5/1/
I would like to submit having this work as a feature request (although I recognize that's unlikely, given the response to this issue so far haha). Is this comment sufficient to do so, or should I open a new issue?
Have you tried this version of the ng-repeat directive? #1661
It fixes a number of issues the repeater had with primitive values. @NickHeiner : I am not exactly sure what specific feature you are requesting?
Yes, I would like to be able to use ng-model within an ng-repeat on a list of strings and be able to have two way binding work as expected.
I understand why it doesn't work now, and realize that making it work could be more trouble than it's worth, but I think it's worth looking in to because it would make angular easier to work with.
The only way to make it work without changing the way that Javascript works
is to use someArray[$index] within your repeat loop. E.g.
This allows you to reference the element directly so that changes are
reflected in the array.
But this doesn't work correctly with the current ng-repeat implementation
because the divs that contain the input keep getting destroyed or moved
around on each change. The fix I referenced before does allow this.
Yes, I would like to be able to use ng-model within an ng-repeat on a
list of strings and be able to have two way binding work as expected.
I understand why it doesn't work now, and realize that making it work
could be more trouble than it's worth, but I think it's worth looking in to
because it would make angular easier to work with.
—
Reply to this email directly or view it on GitHubhttps://github.com//issues/1267#issuecomment-11293595.
Activity
mhevery commentedon Aug 15, 2012
I am assuming you had this:
this will not work since you are binding to a scope. Basically you have to have a
.
inng-model
or the revers data binding does not work on primitives.so this is basically expected because you are binding to a scope.value property not to the original value in the repeater.
The flicker is also expected with your workaround since data binding changes the array, which then makes it look like to the repeater as if
Value 1
left and newValue 2X
appeared, so the repeater removes the old DOM node and replaces it with a new DOM node hence the loss of focus.I know this is counter intuitive, but that is how the system is architected. Don't bind to primitives is my answer.
donovanh commentedon Aug 15, 2012
Thank you for the follow up. I'll adjust my data structure to take this into account.
nick-skriabin commentedon Nov 15, 2012
My example doesn't work too: http://jsfiddle.net/nicholas_r/7KrQ5/
I followed the solution given here but it didn't give any effect and the problem is still here.
petebacondarwin commentedon Nov 15, 2012
The solution given here says, "you have to have a
.
inng-model
." You did not do this. Yours isng-model="field"
.You need to restructure your data so that you have an array of objects not strings.
Here is a fixed fiddle: http://jsfiddle.net/7KrQ5/1/
nick-skriabin commentedon Nov 15, 2012
Oh, my fault. Thanks.
NickHeiner commentedon Dec 11, 2012
I would like to submit having this work as a feature request (although I recognize that's unlikely, given the response to this issue so far haha). Is this comment sufficient to do so, or should I open a new issue?
petebacondarwin commentedon Dec 12, 2012
Have you tried this version of the ng-repeat directive?
#1661
It fixes a number of issues the repeater had with primitive values.
@NickHeiner : I am not exactly sure what specific feature you are requesting?
NickHeiner commentedon Dec 12, 2012
I'm requesting a feature where you can bind directly to a string within an ng-repeat.
petebacondarwin commentedon Dec 12, 2012
You can do that now. I suspect what you mean is that you want the scope outside the ng-repeat to update when the string is updated?
NickHeiner commentedon Dec 12, 2012
Yes, I would like to be able to use
ng-model
within anng-repeat
on a list of strings and be able to have two way binding work as expected.I understand why it doesn't work now, and realize that making it work could be more trouble than it's worth, but I think it's worth looking in to because it would make angular easier to work with.
petebacondarwin commentedon Dec 12, 2012
The only way to make it work without changing the way that Javascript works
is to use someArray[$index] within your repeat loop. E.g.
This allows you to reference the element directly so that changes are
reflected in the array.
But this doesn't work correctly with the current ng-repeat implementation
because the divs that contain the input keep getting destroyed or moved
around on each change. The fix I referenced before does allow this.
On 12 December 2012 15:35, Nick Heiner notifications@github.com wrote:
NickHeiner commentedon Dec 14, 2012
Yep, that works. Thanks!
13 remaining items