J'essaie de permettre à l'utilisateur de modifier une liste d'éléments en utilisant ngRepeat
et ngModel
. ( Voir ce violon .) Cependant, les deux approches que j'ai essayées mènent à un comportement bizarre: l'une ne met pas à jour le modèle et l'autre brouille le formulaire à chaque keydown.
Est-ce que je fais quelque chose de mal ici? N'est-ce pas un cas d'utilisation pris en charge?
Voici le code du violon, copié pour plus de commodité:
<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
la source
la source
Réponses:
Cela semble être une question contraignante.
Le conseil est de ne pas se lier aux primitifs .
Votre
ngRepeat
itère sur des chaînes à l'intérieur d'une collection, alors qu'il devrait itérer sur des objets. Pour résoudre votre problèmejsfiddle: http://jsfiddle.net/jaimem/rnw3u/5/
la source
Utilisation de la dernière version Angular (1.2.1) et suivi par
$index
. Ce problème est résoluhttp://jsfiddle.net/rnw3u/53/
la source
Vous vous retrouvez dans une situation difficile lorsqu'il est nécessaire de comprendre comment fonctionnent les scopes , ngRepeat et ngModel avec NgModelController . Essayez également d'utiliser la version 1.0.3. Votre exemple fonctionnera un peu différemment.
Vous pouvez simplement utiliser la solution fournie par jm-
Mais si vous voulez aborder la situation plus profondément, vous devez comprendre:
Comment votre exemple "Liaison directe à chaque élément" fonctionne pour AngularJS 1.0.3:
'f'
en entrée;ngModelController
modifie le modèle pour la portée de l'élément (le tableau des noms n'est pas modifié) =>name == 'Samf'
,names == ['Sam', 'Harry', 'Sally']
;$digest
la boucle est lancée;ngRepeat
remplace la valeur du modèle de la portée de l'élément ('Samf'
) par la valeur du tableau des noms inchangés ('Sam'
);ngModelController
renvoie l'entrée avec la valeur réelle du modèle ('Sam'
).Comment fonctionne votre exemple "Indexation dans le tableau":
'f'
en entrée;ngModelController
change l'élément dans les nomsarray
=> `names == ['Samf', 'Harry', 'Sally'];ngRepeat
ne peut pas trouver'Samf'
dans le cache;ngRepeat
crée une nouvelle portée, ajoute un nouvel élément div avec une nouvelle entrée (c'est pourquoi le champ d'entrée perd le focus - l'ancien div avec l'ancienne entrée est remplacé par un nouveau div avec une nouvelle entrée);En outre, vous pouvez essayer d'utiliser AngularJS Batarang et voir comment change $ id de la portée de div avec l'entrée dans laquelle vous entrez.
la source
Si vous n'avez pas besoin que le modèle se mette à jour à chaque coup de touche, il vous suffit de lier
name
et de mettre à jour l'élément de tableau lors de l'événement de flou:la source
ng-model="names[$index]"
... Je sais que c'est une solution de contournement, mais cela fonctionne ;-)Je viens de mettre à jour AngularJs vers la version 1.1.2 et je n'ai aucun problème avec cela. Je suppose que ce bug a été corrigé.
http://ci.angularjs.org/job/angular.js-pete/57/artifact/build/angular.js
la source
Le problème semble être la façon dont
ng-model
fonctionneinput
et écrase l'name
objet, le rendant perdung-repeat
.Comme solution de contournement, on peut utiliser le code suivant:
J'espère que ça aide
la source
J'ai essayé la solution ci-dessus pour mon problème, cela fonctionnait comme un charme. Merci!
http://jsfiddle.net/leighboone/wn9Ym/7/
Voici ma version de cela:
et mon HTML
la source
comment faire quelque chose comme:
Et dans mon élément inspecteur soyez:
la source