Das liegt daran, dass Sie die Array-Referenz in Ihrer Methode getDifferences
ändern.
Um das zu vermeiden, uns Punkt, zum Beispiel mit "Controller als" Syntax: Ein weiterer https://github.com/angular/angular.js/wiki/Understanding-Scopes#ngRepeat
:
<div ng-controller="myController as c">
[...]
<tr ng-repeat="data in c.dataDifferenceArray">
<td>
{{data.name}}
</td>
<td>
{{data.startData}}
</td>
<td>
{{data.endData}}
</td>
<td>
{{data.differenceData}}
</td>
</tr>
[...]
Wenn Sie verstehen wollen, wie die Arbeit Tive, ich diesen Artikel empfehlen würde Lösung könnte sein:
$scope.getDifferences = function() {
$scope.dataDifferenceArray.length = 0; // here ----
var i;
for (i = 0; i < 20 ;i++) {
$scope.dataDifferenceArray.push({
name : 30,
startData : 20,
endData : 2,
differenceData : 30
})
}
}
aber in dieser Lösung müssen Sie das Array außerhalb (und auf einmal ly): $scope.dataDifferenceArray = [];
Edit2: Meine Antwort war nicht wirklich klar, wollen wir versuchen zu verstehen, was in tiefen passiert:
Q:Warum die ng-repeat noch die Referenz Regelwerk1 hat ?
Sie müssen daran denken, dass nicht nur 1 Bereich in Ihrer Vorlage ist.
ZB: Die ng-repeat
Direktive erstellt neue Bereiche für jedes der wiederholten Elemente, aber wir können immer noch auf den übergeordneten Bereich in jedem untergeordneten Bereich zugreifen. Angular hat dieses Verhalten unter Verwendung von Prototypvererbung implementiert: Jeder untergeordnete Bereich erbt die Eigenschaften seines übergeordneten Bereichs dank seines Prototyps.
Sie können experimentieren, wie es funktioniert, indem Sie eines auf Ihren untergeordneten Elementen untersuchen und dann in die Konsole eingeben: $($0).scope()
(es gibt Ihnen den Bereich des ausgewählten Elements, $0
ist das ausgewählte Element (Chrome)). Sie können jetzt sehen, dass das gleiche Objekt in $($0).scope().$parent
und $($0).scope().__proto__
ist, es ist Ihr übergeordneter Bereich.
Aber es gibt ein Problem mit Prototypvererbung: Lassen Sie uns sagen, dass wir A = {}; B = {C: 1}
haben, wenn A
erbt von B
dann A.C == 1
. Aber wenn wir einen neuen Wert A.C = 2
beeinflussen, haben wir nicht geändert B
, nur A
.
Winkelausdrücke werden mit dem aktuellen Gültigkeitsbereich als this
ausgewertet.Also, wenn wir etwas wie ng-click="dataDifferenceArray = []"
haben, ist es äquivalent zu this.dataDifferenceArray = []
mit this
der Bereich des Elements ist, wo ng-click
ist.
Dieses Problem ist gelöst, wenn Sie Controller-als verwenden, da es den Controller in den Bereich injiziert und Sie nie eine Eigenschaft direkt auf den Bereich auswirken.
unser Beispiel Lassen Sie zurücknehmen: A = {}; B = {C: {D: 1}}
, wenn A
erbt von B
dann A.C.D == 1
. Und jetzt, auch wenn wir einen neuen Wert A.C.D = 2
beeinflussen, änderten wir B
auch.
Alle Fehler in der Konsole? Können Sie in einem Plunkr replizieren? – tymeJV
Ist Ihr HTML korrekt an den Controller gebunden? – illiptic