Estoy tratando de permitir que el usuario edite una lista de elementos usando ngRepeat
y 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
ngRepeat
es 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;ngModelController
cambios en el modelo para el ámbito artículo (nombres de matriz no se cambia) =>name == 'Samf'
,names == ['Sam', 'Harry', 'Sally']
;$digest
se inicia el bucle;ngRepeat
reemplaza el valor del modelo del alcance del elemento ('Samf'
) por el valor de la matriz de nombres sin cambios ('Sam'
);ngModelController
vuelve 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;ngModelController
cambia el elemento en los nombresarray
=> `nombres == ['Samf', 'Harry', 'Sally'];ngRepeat
no se puede encontrar'Samf'
en el caché;ngRepeat
crea 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
name
y 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-model
funcionainput
y sobrescribe elname
objeto, 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