Reset-ein Modell mit angular.js
Bin ich einfach versuchen Sie zum zurücksetzen der Werte so :
$scope.initial = [
{
data1: 10,
data2: 20
}
];
$scope.datas= $scope.initial;
$scope.reset = function(){
$scope.datas = $scope.initial;
}
Aber ist es nicht etwas zu produzieren, irgendeine Idee um es zu beheben ?
JS:
angular.module('app', []).controller('MyCtrl', function($scope) {
$scope.initial = [
{
data1: 10,
data2: 20
}
];
$scope.datas= $scope.initial;
$scope.reset = function(){
$scope.datas = $scope.initial;
}
});
HTML:
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="MyCtrl">
<div ng-repeat="data in datas">
<input type="text" ng-model="data.data1" />
<input type="text" ng-model="data.data2" />
</div>
<a ng-click="reset()">Reset to initial value</a>
or
<button ng-click="name = initial">Reset to initial value</button>
<hr />
<p ng-repeat="data in datas">{{data.data1}}, {{data.data2}}</p>
</div>
Es ist ein funktionierendes Beispiel auf jsfiddle
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist wirklich eine Frage über JavaScript (so habe ich den "javascript" - tag). Wenn ein JavaScript-Objekt (wie array $Umfang.erste) wird einer Variablen zugewiesen, dem es zugeordnet ist, die durch Verweis, nicht kopieren. Also, diese Aussage
Ergebnisse in $scope.Daten zeigen auf den $scope.ersten Objekt. Alle änderungen, die vorgenommen werden, $Umfang.Daten oder $Umfang.erste wirken sich beide auf dem gleichen (Einzel -) Objekt. Seit ng-Modell wird verwendet, um data-bind object-Elemente data1 und data2, keine änderungen an den text ein, ändern sich die data1 und data2 Elemente des Objekts, das $scope.Daten-Referenzen-D. H., $Umfang.initial ist. Um dies in Aktion zu sehen, fügen Sie den folgenden, um Ihre Geige HTML:
Wenn Sie ändern Sie die Werte in die Textfelder, wirst du sehen, dass $Umfang.ersten ändert sich auch.
@Max bereitgestellt, eine partielle Antwort: verwenden Sie eckige.copy() in die reset-Funktion. Aber Sie müssen auch verwenden Sie eckige.copy() bei der erstmaligen Zuweisung zu:
Update:
Als @EpokK zeigt in seiner Antwort, eine Alternative Lösung ist
Als @bekite erwähnt in seiner Antwort, @EpokK die Lösung nicht erstellen Sie ein anderes Objekt.
Den vollständigen code
JS:
HTML:
fiddle
$scope.initial = JSON.parse(JSON.stringify($scope.datas));
als schneller zu Klonen. Währendangular.copy
ist viel robuster, mit großen Datensätzen kann es kauen, bis ms.Versuchen Sie, die
reset
Funktion zu verwenden,Winkel.copy
@Mark Rajcok:
Versteh mich nicht falsch, aber ich denke, dass
ist nicht eine Alternative syntax für
Ich verstehe es so:
Erstellt eine Kopie von $scope.anfängliche und weist die Referenz auf $scope.Daten.
Updates $Umfang.Daten Werte mit $scope.Anfangswerte
Finden Sie in der angularjs-docs ( http://docs.angularjs.org/api/angular.copy ),und da die sektion über die Return-Anweisung
Arbeiten syntax :
API-Referenz :
angular.copy(source[, destination]);
angular.copy(source, destination)
oderdestination = angular.copy(source)
Betrachten Sie die folgenden Tasten
Wenn Nutzer Bearbeiten und Veränderungen Daten und verwendet dann die Abbrechen - button, um die alten Daten, hier ist, wie könnte man dies umsetzen.
HTML
AngularJs
Referenzen
Ich Liebe Yasser Kommentar: klar und prägnant.
Ich bevorzuge definitiv das kopieren des Wertes beim starten auf Bearbeiten und dann einfach das austauschen der Verweis auf Abbrechen/speichern.
Bevorzuge ich die Bindung auf einer lokalen Kopie, und nicht die ursprünglichen Daten, und dann ändern der endgültigen Daten nur auf speichern.
Diese verhindern, dass alle möglichen Fehler später, und kapselt das edit-Verhalten.
Die endgültige version wäre:
Ich verwendet haben, als Sie alle oben gesagt, durch die Aufrechterhaltung eines back-up, aber während Sie es ich vor einem problem mehr.
Ich dachte, wenn ich es hier posten, es wäre hilfreich für andere
Ich habe Profil-Abschnitt-code wie folgt:
Aber ich war überrascht zu sehen, dass auch non-scope-variable profileBackup aktualisiert wurde, wenn sich das Modell ändert (ich glaube, die Referenz zurückgegeben wird, in diesem Fall)
Dann habe ich meinen code wie folgt:
bitte verzeihen Sie mir, wenn es gar keinen Sinn..