2015-07-18 14 views
6

Ich würde gerne einen Bereich in Angular von einer Funktion außerhalb Angular aktualisieren können.Aktualisierung des Umfangs von außerhalb AngularJs ohne Verwendung von "angular.element.scope"

Zum Beispiel, wenn ich ein jQuery-Plugin habe, das einen Erfolgsrückruf zurückgibt, würde ich gerne in der Lage sein, den Bereich von diesem Erfolgsrückruf zu aktualisieren. Jede Lösung, die ich dafür gesehen habe, beinhaltet den Aufruf angular.element(selector).scope und dann Aufruf $apply auf den Bereich, der zurückgegeben wird. Ich habe jedoch auch viele Kommentare gesehen, die darauf hinweisen, dass dies nicht funktioniert, wenn die Debug-Informationen deaktiviert sind. Daher wird es nicht empfohlen, aber ich habe keine alternativen Lösungen gesehen.

Kennt jemand eine Möglichkeit, den Bereich außerhalb von Angular zu aktualisieren, ohne angular.element(selector).scope zu verwenden?

Hier ist die akzeptierte Lösung in der Post.

„Sie müssen $scope.$apply() verwenden, wenn Sie von außerhalb der Kontrolle von AngularJS wie ein jQuery/Javascript Event-Handler alle Änderungen an einem Umfang Wert machen wollen

function change() { 
    alert("a"); 
    var scope = angular.element($("#outer")).scope(); 
    scope.$apply(function(){ 
     scope.msg = 'Superhero'; 
    }); 
} 

Hier ist eine Warnung, dass .scope() funktioniert nicht, wenn Daten Debug-off in der Post ist:

„zu Ihrer Information die Dokumentation nach .scope() Verwendung erfordert die Debug-Daten ermöglichen werden d aber die Verwendung von Debug-Daten in der Produktion wird aus Gründen der Geschwindigkeit nicht empfohlen. Die Lösungen unten scheinen um Umfang zu drehen() - rtpHarry 5. Dezember '14 um 15:12 Uhr "

Ich sehe keine andere Lösung .scope() in diesem Beitrag oder in anderen ähnlichen Stellen zu verwenden

.

AngularJS access scope from outside js function

Dank!

aktualisieren Eine mögliche Lösung nicht mit angular.element(selector).scope war ich den Umfang in der Steuerung zugewiesen I FirstCtrl an das Fenster-Objekt wurde. injiziert I $window in den FirstCtrl Controller und tat das folgende:

$window.FirstCtrlScope = $scope; 

dann von jQuery oder andere Javascript was ich tun konnte:

var scope=window.FirstCtrlScope; 
scope.$apply(function() { 
     // update the scope 
}); 

Ist dies eine gute Lösung oder gibt es bessere Lösungen für einen Bereich zu aktualisieren, ohne angular.element(selector).scope?

Danke!

Antwort

1

Ich denke beide Wege sind schlecht. Ein Design, das Controller als globale Variablen oder den Zugriff auf den Bereich per HTML-Element festlegt, führt zu einer nicht mehr wartbaren Anwendung mit vielen versteckten Links.

Wenn Sie mit jQuery-Plugins (oder anderem nicht-eckigen Code) zusammenarbeiten möchten, müssen Sie es in die Direktive mit einer eindeutigen API (Attribute, Bindungen und Callbacks) einbinden.

1

Sie können den Bereich einem Datenattribut für das Element zuweisen und dann auf diesen zugreifen. Schauen Sie sich here an, wo die angular-ui-bootstrap-Bibliothek diesen Ansatz implementiert hat.

Verwandte Themen