Wenn ich eine Ansicht lade, möchte ich einen Initialisierungscode in dem zugehörigen Controller ausführen.
Zu diesem Zweck habe ich die ng-init-Direktive für das Hauptelement meiner Ansicht verwendet:
<div ng-init="init()">
blah
</div>
und in der Steuerung:
$scope.init = function () {
if ($routeParams.Id) {
//get an existing object
});
} else {
//create a new object
}
$scope.isSaving = false;
}
Erste Frage: Ist das der richtige Weg?
Als nächstes habe ich ein Problem mit der Abfolge der Ereignisse. In der Ansicht habe ich eine Schaltfläche "Speichern", die die ng-disabled
Direktive als solche verwendet:
<button ng-click="save()" ng-disabled="isClean()">Save</button>
Die isClean()
Funktion ist in der Steuerung definiert:
$scope.isClean = function () {
return $scope.hasChanges() && !$scope.isSaving;
}
Wie Sie sehen können, wird das $scope.isSaving
Flag verwendet, das in der init()
Funktion initialisiert wurde .
Problem: Wenn die Ansicht geladen wird, wird die isClean Funktion aufgerufen , bevor die init()
Funktion, damit das Flag isSaving
ist undefined
. Was kann ich tun, um das zu verhindern?
Seit AngularJS 1.5 sollten wir verwenden,
$onInit
was für jede AngularJS-Komponente verfügbar ist. Entnommen aus der Dokumentation zum Komponentenlebenszyklus seit Version 1.5 ist die bevorzugte Methode:>> Fiddle Demo
Ein erweitertes Beispiel für die Verwendung des Komponentenlebenszyklus:
Der Komponentenlebenszyklus gibt uns die Möglichkeit, mit Komponentenmaterial gut umzugehen. Es ermöglicht uns, Ereignisse für z. B. "Init", "Ändern" oder "Zerstören" einer Komponente zu erstellen. Auf diese Weise können wir Dinge verwalten, die vom Lebenszyklus einer Komponente abhängen. Dieses kleine Beispiel zeigt, wie Sie einen
$rootScope
Ereignis-Listener registrieren und die Registrierung aufheben$on
. Wenn wir wissen, dass ein$on
gebundenes Ereignis$rootScope
nicht unberührt bleibt, wenn der Controller seine Referenz in der Ansicht verliert oder zerstört wird, müssen wir einen$rootScope.$on
Listener manuell zerstören . Ein guter Ort, um dieses Zeug zu platzieren, ist die$onDestroy
Lebenszyklusfunktion einer Komponente:>> Geigen-Demo
quelle
Oder Sie können einfach Inline im Controller initialisieren. Wenn Sie eine Controller-interne Funktion verwenden, muss diese nicht im Bereich definiert werden. In der Tat kann es selbst ausgeführt werden:
quelle
Ich verwende die folgende Vorlage in meinen Projekten:
quelle