Ich habe über die neue Syntax von angleJS bezüglich gelesencontroller as xxx
Die Syntax
InvoiceController as invoice
weist Angular an, den Controller zu instanziieren und in der Variablenrechnung im aktuellen Bereich zu speichern.
Visualisierung:
Ok, ich habe den Parameter nicht $scope
in meinem Controller und der Code wird im Controller viel sauberer.
Aber
Ich muss einen anderen Alias in der Ansicht angeben
Also bis jetzt konnte ich tun:
<input type="number" ng-model="qty" />
....controller('InvoiceController', function($scope) {
// do something with $scope.qty <--notice
Und jetzt kann ich tun:
<input type="number" ng-model="invoic.qty" /> <-- notice
....controller('InvoiceController', function() {
// do something with this.qty <--notice
Frage
Was ist das Ziel dabei? von einem Ort entfernen und an einen anderen Ort hinzufügen?
Ich werde froh sein zu sehen, was mir fehlt.
javascript
angularjs
Royi Namir
quelle
quelle
controller as
behoben wird).Antworten:
Es gibt verschiedene Dinge.
Einige Leute mögen die
$scope
Syntax nicht (frag mich nicht warum). Sie sagen, dass sie nur gebrauchen könntenthis
. Das war eines der Ziele.Es ist auch sehr nützlich, klar zu machen, woher eine Immobilie stammt.
Sie können Controller verschachteln, und beim Lesen des HTML-Codes ist ziemlich klar, woher jede Eigenschaft kommt.
Sie können auch vermeiden , einige der Punkt Regel Probleme.
Wenn Sie beispielsweise zwei Controller mit demselben Namen 'name' haben, können Sie Folgendes tun:
Sie können sowohl Eltern als auch Kinder ändern, kein Problem. Sie müssen jedoch verwenden
$parent
, um den Namen des Elternteils anzuzeigen, da Sie ihn in Ihrem untergeordneten Controller beschattet haben. In massiven HTML-Code$parent
könnte problematisch sein, Sie wissen nicht, woher dieser Name kommt.Mit können
controller as
Sie tun:Gleiches Beispiel, aber es ist viel klarer zu lesen.
$scope
Plunkercontroller as
Plunkerquelle
foo() { ... }
ist viel sauberer als$scope.foo = function() { ... }
.Der Hauptvorteil der
controller as
Syntax, den ich sehe, besteht darin, dass Sie mit Controllern als Klassen arbeiten können, nicht nur mit einigen Funktionen zum Dekorieren von $ scope, und die Vererbung nutzen können. Ich stoße oft auf eine Situation, in der es eine Funktionalität gibt, die einer Reihe von Controllern sehr ähnlich ist, und das naheliegendste ist, eineBaseController
Klasse zu erstellen und davon zu erben.Obwohl es eine $ scope-Vererbung gibt, die dieses Problem teilweise löst, bevorzugen einige Leute es, Code auf eine OOP-Weise zu schreiben, was meiner Meinung nach das Nachdenken und Testen des Codes erleichtert.
Hier ist eine Geige zum Demonstrieren: http://jsfiddle.net/HB7LU/5796/
quelle
Ich glaube, ein besonderer Vorteil liegt auf der Hand, wenn Sie Bereiche verschachtelt haben. Es ist nun völlig klar, aus welchem Bereich eine Eigenschaftsreferenz stammt.
quelle
Quelle
Unterschied zwischen dem Erstellen eines Controllers mit
$scope object
der“controller as”
Syntax und vmErstellen eines Controllers mit dem Objekt $ scope
Normalerweise erstellen wir einen Controller mit dem $ scope-Objekt, wie in der folgenden Liste gezeigt:
Oben erstellen wir den AddController mit drei Variablen und einem Verhalten unter Verwendung des $ scope-Objektcontrollers und der Ansicht, die miteinander kommunizieren. Das $ scope-Objekt wird verwendet, um Daten und Verhalten an die Ansicht zu übergeben. Es klebt die Ansicht und den Controller zusammen.
Im Wesentlichen führt das $ scope-Objekt die folgenden Aufgaben aus:
Übergeben Sie Daten vom Controller an die Ansicht
Übergeben Sie das Verhalten vom Controller an die Ansicht
Klebt den Controller und die Ansicht zusammen
Das $ scope-Objekt wird geändert, wenn sich eine Ansicht ändert, und eine Ansicht wird geändert, wenn sich die Eigenschaften des $ scope-Objekts ändern
Wir hängen Eigenschaften an ein $ scope-Objekt an, um Daten und Verhalten an die Ansicht zu übergeben. Bevor Sie das $ scope-Objekt im Controller verwenden, müssen Sie es in der Controller-Funktion als Abhängigkeiten übergeben.
Verwenden der Syntax "controller as" und vm
Wir können den obigen Controller unter Verwendung des Controllers als Syntax und der VM-Variablen wie in der folgenden Liste gezeigt umschreiben:
Im Wesentlichen weisen wir dies einer Variablen vm zu und fügen dieser dann eine Eigenschaft und ein Verhalten hinzu. In der Ansicht können wir mit Controller als Syntax auf den AddVmController zugreifen. Dies wird in der folgenden Liste gezeigt:
Natürlich können wir im Controller einen anderen Namen als "vm" als Syntax verwenden. Unter der Haube erstellt AngularJS das $ scope-Objekt und hängt die Eigenschaften und das Verhalten an. Wenn Sie jedoch den Controller als Syntax verwenden, ist der Code auf dem Controller sehr sauber und nur der Aliasname ist in der Ansicht sichtbar.
Hier sind einige Schritte, um den Controller als Syntax zu verwenden:
Erstellen Sie einen Controller ohne $ scope-Objekt.
Weisen Sie dies einer lokalen Variablen zu. Ich habe den Variablennamen als vm bevorzugt. Sie können einen beliebigen Namen Ihrer Wahl wählen.
Hängen Sie Daten und Verhalten an die Variable vm an.
Geben Sie in der Ansicht dem Controller einen Alias, indem Sie den Controller als Syntax verwenden.
Sie können dem Alias einen beliebigen Namen geben. Ich bevorzuge die Verwendung von VM, es sei denn, ich arbeite nicht mit verschachtelten Controllern.
Beim Erstellen des Controllers gibt es keine direkten Vor- oder Nachteile der Verwendung des $ scope-Objektansatzes oder des Controllers als Syntax. Es ist jedoch nur eine Frage der Wahl, ob die Verwendung des Controllers als Syntax den JavaScript-Code des Controllers besser lesbar macht und Probleme im Zusammenhang mit diesem Kontext verhindert.
Verschachtelte Controller im $ scope-Objektansatz
Wir haben zwei Controller, wie in der folgenden Liste gezeigt:
Die Eigenschaft "Alter" befindet sich in beiden Controllern. In der Ansicht können diese beiden Controller wie in der folgenden Liste gezeigt verschachtelt werden:
Wie Sie sehen, verwenden wir für den Zugriff auf die age-Eigenschaft des übergeordneten Controllers die Datei $ parent.age. Die Kontexttrennung ist hier nicht sehr klar. Mit dem Controller als Syntax können wir jedoch eleganter mit verschachtelten Controllern arbeiten. Nehmen wir an, wir haben Controller wie in der folgenden Liste gezeigt:
In der Ansicht können diese beiden Controller wie in der folgenden Liste gezeigt verschachtelt werden:
Im Controller als Syntax haben wir besser lesbaren Code und auf die übergeordnete Eigenschaft kann mit dem Aliasnamen des übergeordneten Controllers zugegriffen werden, anstatt mit der übergeordneten Syntax $.
Ich werde diesen Beitrag mit der Aussage abschließen, dass es nur Ihre Wahl ist, ob Sie den Controller als Syntax oder das $ scope-Objekt verwenden möchten. Es gibt auch keinen großen Vor- oder Nachteil, einfach, dass der Controller als Syntax, die Sie im Kontext steuern können, etwas einfacher zu handhaben ist, da die verschachtelten Controller in der Ansicht klar voneinander getrennt sind.
quelle
Ich finde, der Hauptvorteil ist eine intuitivere API, da die Methoden / Eigenschaften direkt mit der Controller-Instanz und nicht mit dem Scope-Objekt verknüpft sind. Grundsätzlich wird der Controller mit dem alten Ansatz nur zu einer Dekoration für den Aufbau des Scope-Objekts.
Hier einige weitere Informationen dazu: http://www.syntaxsuccess.com/viewarticle/551798f20c5f3f3c0ffcc9ff
quelle
Nach dem, was ich gelesen habe, wird $ scope in Angular 2.0 entfernt, oder zumindest wie wir die Verwendung von $ scope sehen. Es könnte sinnvoll sein, den Controller zu verwenden, wenn sich die Veröffentlichung von 2.0 nähert.
Videolink hier für weitere Diskussionen.
quelle