17

Ich würde gerne die Option 'controllerAs' in meinen Anweisungen verwenden. Lassen Sie mich die Begründung aus "An AngularJS Style Guide for Closure Users at Google" zitieren:"Controller als" vs isolieren Bereich

Warum? Putting Methoden und Eigenschaften direkt auf den Controller, statt ein Scope-Objekt zu erstellen, passt besser mit dem Google Closure-Klasse Stil. Darüber hinaus macht es die Verwendung von "Controller as" offensichtlich, auf welchen Controller Sie zugreifen, wenn mehrere Controller auf ein Element angewendet werden. Da gibt es immer ein '.' in den Bindungen müssen Sie sich nicht um prototypische Vererbung maskieren Primitive kümmern.

Aber ich sehe ein Problem mit diesem Ansatz, wenn die Direktive isolieren Bereich Bindings hat.

angular.module('cmw').directive('fooWidget', function() { 
    return { 
     controller: function() { 
      this.qux = '123'; 
     }, 
     controllerAs: 'fooWidget', 
     scope: { 
      bar: '=' 
     }, 
     template: ' {{fooWidget.qux}} {{bar}} ' 
    }; 
}); 

In diesem Fall wird die bar Eigenschaft auf den Umfang angebracht ist, nicht an die Steuerung, die in einer verwirrenden inkonsistenten Situation führt, wo unterschiedliche Eigenschaften in verschiedenen Orten gesucht werden sollen. Was ist der "offizielle" empfohlene Weg, um dies zu umgehen?

UPDATE: siehe die GitHub issue darüber.

Antwort

8

Dies wurde in Angular 1.3 durch Hinzufügen der bindToController-Eigenschaft zu directive API aufgelöst.

2

Es ist schwer ein "offizielles" Muster dafür zu finden. Persönlich denke ich, es hängt davon ab, was dein Ziel ist.

Wenn Sie Informationen aus einer Richtlinie der Außenwelt zugänglich machen möchten, verwenden Sie den isolierten Bereich, da dies einer der Gründe dafür ist. Dieses "API" muss auch nicht vollständig in der Richtlinie definiert werden, es kann in einem AngularJS Service definiert werden, den Sie in eine Richtlinie einfügen und durch den Isolierten Anwendungsbereich aufzeigen, so dass Sie eine Direktive haben, die hauptsächlich die UI betrifft zusammen mit einem Service, der jede Geschäftslogik behandelt.

Wenn Sie zwischen Richtlinien kommunizieren, wird ein Controller bevorzugt.

Aber zu versuchen und etwas mehr offizielle Informationen zu erhalten, hier ist es, Informationen aus der AngularJS Website über die Verwendung von Controllern mit den Richtlinien:

Best Practice: Einsatz-Controller, wenn Sie eine API zu anderen Richtlinien machen möchten . Ansonsten benutze den Link.

Ich habe persönlich nie Controller in Richtlinien verwendet, außer für die Kommunikation zwischen Direktive und Direktive. Ich sage nicht, dass du sie nicht benutzen kannst, ich habe es einfach nicht gesehen. Wenn Sie die Controller-Logik der Außenwelt zugänglich machen möchten, müssen Sie sich auch an den isolierten Bereich binden, so dass alles davon abhängt, was Sie tun möchten.