Estoy tratando de permitir que el usuario edite una lista de elementos usando ngRepeaty ngModel. ( Vea este violín ). Sin embargo, ambos enfoques que he probado conducen a un comportamiento extraño: uno no actualiza el modelo y el otro difumina el formulario en cada tecla.
¿Estoy haciendo algo mal aquí? ¿No es este un caso de uso compatible?
Aquí está el código del violín, copiado por conveniencia:
<html ng-app>
<head>
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet">
</head>
<body ng-init="names = ['Sam', 'Harry', 'Sally']">
<h1>Fun with Fields and ngModel</h1>
<p>names: {{names}}</p>
<h3>Binding to each element directly:</h3>
<div ng-repeat="name in names">
Value: {{name}}
<input ng-model="name">
</div>
<p class="muted">The binding does not appear to be working: the value in the model is not changed.</p>
<h3>Indexing into the array:</h3>
<div ng-repeat="name in names">
Value: {{names[$index]}}
<input ng-model="names[$index]">
</div>
<p class="muted">Type one character, and the input field loses focus. However, the binding appears to be working correctly.</p>
</body>
</html>
angularjs
angularjs-ng-repeat
angularjs-ng-model
Nick Heiner
fuente
fuente

Respuestas:
Este parece ser un tema vinculante.
El consejo es no ligarse a los primitivos .
Su
ngRepeates la iteración del cuerdas dentro de una colección, cuando debería ser la iteración sobre los objetos. Para solucionar tu problemajsfiddle: http://jsfiddle.net/jaimem/rnw3u/5/
fuente
Usando la última versión de Angular (1.2.1) y rastrea por
$index. Este problema está solucionadohttp://jsfiddle.net/rnw3u/53/
fuente
Te encuentras en una situación difícil cuando es necesario comprender cómo funcionan los ámbitos , ngRepeat y ngModel con NgModelController . También intente utilizar la versión 1.0.3. Tu ejemplo funcionará de manera un poco diferente.
Simplemente puede usar la solución proporcionada por jm-
Pero si quieres lidiar con la situación más profundamente, debes entender:
Cómo funciona su ejemplo "Enlace a cada elemento directamente" para AngularJS 1.0.3:
'f'en la entrada;ngModelControllercambios en el modelo para el ámbito artículo (nombres de matriz no se cambia) =>name == 'Samf',names == ['Sam', 'Harry', 'Sally'];$digestse inicia el bucle;ngRepeatreemplaza el valor del modelo del alcance del elemento ('Samf') por el valor de la matriz de nombres sin cambios ('Sam');ngModelControllervuelve a reproducir la entrada con el valor real del modelo ('Sam').Cómo funciona su ejemplo "Indexación en la matriz":
'f'en la entrada;ngModelControllercambia el elemento en los nombresarray=> `nombres == ['Samf', 'Harry', 'Sally'];ngRepeatno se puede encontrar'Samf'en el caché;ngRepeatcrea un nuevo alcance, agrega un nuevo elemento div con una nueva entrada (es por eso que el campo de entrada pierde el foco: el div antiguo con la entrada antigua se reemplaza por un nuevo div con la nueva entrada);Además, puede intentar usar AngularJS Batarang y ver cómo cambia $ id del alcance de div con la entrada en la que ingresa.
fuente
Si no necesita que el modelo se actualice con cada pulsación de tecla, simplemente enlace
namey luego actualice el elemento de la matriz en el evento de desenfoque:fuente
ng-model="names[$index]"... Sé que es una solución alternativa, pero funciona ;-)Acabo de actualizar AngularJs a 1.1.2 y no tengo ningún problema con eso. Supongo que este error se solucionó.
http://ci.angularjs.org/job/angular.js-pete/57/artifact/build/angular.js
fuente
El problema parece estar en la forma en que
ng-modelfuncionainputy sobrescribe elnameobjeto, haciéndolo perdidong-repeat.Como solución alternativa, se puede utilizar el siguiente código:
Espero eso ayude
fuente
Probé la solución anterior para mi problema y funcionó como un encanto. ¡Gracias!
http://jsfiddle.net/leighboone/wn9Ym/7/
Aquí está mi versión de eso:
y mi HTML
fuente
cómo hacer algo como:
Y en mi elemento de inspector sea:
fuente