Ich versuche dem Benutzer zu erlauben, eine Liste von Elementen mit ngRepeat
und zu bearbeiten ngModel
. ( Siehe diese Geige .) Beide Ansätze, die ich versucht habe, führen jedoch zu bizarrem Verhalten: Einer aktualisiert das Modell nicht und der andere verwischt das Formular bei jedem Tastendruck.
Mache ich hier etwas falsch Ist dies kein unterstützter Anwendungsfall?
Hier ist der Code aus der Geige, der der Einfachheit halber kopiert wurde:
<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>
Wenn Sie
angularjs
angularjs-ng-repeat
angularjs-ng-model
Nick Heiner
quelle
quelle
Antworten:
Dies scheint ein verbindliches Problem zu sein.
Der Rat ist , nicht an Primitive zu binden .
Sie
ngRepeat
iterieren über Zeichenfolgen innerhalb einer Sammlung, wenn sie über Objekte iterieren sollen. Um Ihr Problem zu behebenjsfiddle: http://jsfiddle.net/jaimem/rnw3u/5/
quelle
Verwenden Sie die neueste Version von Angular (1.2.1) und verfolgen Sie nach
$index
. Dieses Problem wurde behobenhttp://jsfiddle.net/rnw3u/53/
quelle
Sie geraten in eine schwierige Situation, wenn Sie verstehen müssen, wie Bereiche , ngRepeat und ngModel mit NgModelController funktionieren. Versuchen Sie auch, die Version 1.0.3 zu verwenden. Ihr Beispiel wird etwas anders funktionieren.
Sie können einfach die von jm- bereitgestellte Lösung verwenden.
Aber wenn Sie sich eingehender mit der Situation befassen möchten, müssen Sie verstehen:
So funktioniert Ihr Beispiel "Direkt an jedes Element binden" für AngularJS 1.0.3:
'f'
in die Eingabe ein.ngModelController
Ändert das Modell für den Elementbereich (Namensarray wird nicht geändert) =>name == 'Samf'
,names == ['Sam', 'Harry', 'Sally']
;$digest
Schleife wird gestartet;ngRepeat
Ersetzt den Modellwert aus item scope ('Samf'
) durch den Wert aus array ('Sam'
) mit unveränderten Namen .ngModelController
Eingabe mit dem tatsächlichen Modellwert erneut rendern ('Sam'
).So funktioniert Ihr Beispiel "Indizieren in das Array":
'f'
in die Eingabe ein.ngModelController
ändert Element in Namenarray
=> `names == ['Samf', 'Harry', 'Sally'];ngRepeat
kann nicht'Samf'
im Cache finden;ngRepeat
erstellt einen neuen Bereich, fügt ein neues div-Element mit neuer Eingabe hinzu (aus diesem Grund verliert das Eingabefeld den Fokus - altes div mit alter Eingabe wird durch neues div mit neuer Eingabe ersetzt);Sie können auch versuchen, AngularJS Batarang zu verwenden und sehen, wie sich $ id des Bereichs von div mit der Eingabe ändert, in die Sie eingeben.
quelle
Wenn Sie das Modell nicht bei jedem Tastendruck aktualisieren müssen, binden Sie es einfach an
name
das Array-Element und aktualisieren Sie es bei einem Unschärfeereignis:quelle
ng-model="names[$index]"
... Ich weiß, es ist eine Problemumgehung, aber es funktioniert ;-)Ich habe gerade AngularJs auf 1.1.2 aktualisiert und habe kein Problem damit. Ich denke, dieser Fehler wurde behoben.
http://ci.angularjs.org/job/angular.js-pete/57/artifact/build/angular.js
quelle
Das Problem scheint in der Art und Weise zu liegen, wie
ng-model
mitinput
demname
Objekt gearbeitet und es überschrieben wird, wodurch es verloren gehtng-repeat
.Als Problemumgehung kann der folgende Code verwendet werden:
Ich hoffe es hilft
quelle
Ich habe die obige Lösung für mein Problem ausprobiert, es hat wie ein Zauber funktioniert. Vielen Dank!
http://jsfiddle.net/leighboone/wn9Ym/7/
Hier ist meine Version davon:
und mein HTML
quelle
wie macht man so etwas wie:
Und in meinem Inspektorelement sei:
quelle