Freigabe des Bereichs zwischen Controller und Direktive in AngularJS

8

Ich habe eine Anweisung zum Umschließen eines jQuery-Plugins erstellt und übermittele ein Konfigurationsobjekt für das Plugin vom Controller an die Direktive. (Werke)

Im Config-Objekt ist ein Callback, den ich bei einem Event aufrufen möchte. (Werke)

Im Callback möchte ich eine Eigenschaft im $ scope des Controllers ändern, die nicht funktioniert . Angular erkennt nicht, dass sich die Eigenschaft aus irgendeinem Grund geändert hat, was zu der Annahme führt, dass sich der $ scope im Callback vom $ scope des Controllers unterscheidet. Mein Problem ist einfach nicht warum.

Kann mir jemand in die richtige Richtung zeigen?

Klicken Sie hier für Fiddle

app.js

%Vor%

html

%Vor%     
simshaun 25.03.2013, 00:35
quelle

2 Antworten

11

In Ihrer Demo gibt es eine Reihe von Problemen mit dem Umfang. Erstens wird innerhalb des Callbacks dateChange , obwohl die Funktion selbst innerhalb des Controllers deklariert ist, der Kontext von this innerhalb des Callbacks das Bootstrap-Element sein, da es sich in einem Bootstrap-Handler befindet.

Immer wenn Sie Winkelbereich-Werte aus Drittanbieter-Code ändern, muss angular darüber informiert werden, indem Sie $apply verwenden. Im Allgemeinen sollten alle Bereiche von Drittanbietern innerhalb der Richtlinie enthalten sein.

Eine etwas kantigere Methode ist die Verwendung von ng-model für die Eingabe. Verwenden Sie dann $.watch für Änderungen am Modell. Dies hilft dabei, den gesamten Code innerhalb des Controllers im eckigen Kontext zu halten. Es ist in jeder eckigen Anwendung selten, ng-model nicht auf Formularsteuerelementen zu verwenden

%Vor%

Innerhalb der Direktive:

%Vor%

Dann im Controller:

%Vor%

Demo: Ссылка

BEARBEITEN Ein weiteres Element, das geändert werden sollte, ist var dateInput = angular.element('.datepicker') entfernen, wenn Sie diese Anweisung für mehr als ein Element in der Seite verwenden möchten. Es ist überflüssig, in Direktiven verwendet zu werden, wobei element bereits eines der Argumente im link Callback ist und instanzspezifisch ist. Ersetzen Sie dateInput durch element

    
charlietfl 25.03.2013, 01:41
quelle
2

Das Ereignis changeDate, das an die Eingabe gebunden ist, scheint so eingerichtet zu sein, dass es außerhalb des Angular-Frameworks ausgelöst wird. Um den Absatz anzuzeigen, rufen Sie $scope.$apply() auf, nachdem Sie dateChanged auf true festgelegt haben. Um den Absatz nach der Verzögerung auszublenden, können Sie $apply() erneut in der Funktion verwenden, die an setTimeout übergeben wurde, aber Sie werden wahrscheinlich keine weiteren Probleme mit Angulars $timeout() statt.

Geige

    
thisgeek 25.03.2013 00:59
quelle