2013-07-25 4 views
33

Die Funktion $apply kann auf jedem Bereich ausgeführt werden, einschließlich $rootScope.

Gibt es Fälle, wenn es einen Unterschied macht, wenn ich es auf meinem lokalen Bereich ausführen oder wenn ich es auf meinem $rootScope ausführen?

Ich frage, weil ich eine Hilfsfunktion erstellen möchte, die eine bestimmte Funktion in einem $apply umschließt. Um das zu tun, müsste ich immer einen Bereich passieren, der A) lästig und B) nicht einfach ist, weil ich nicht unbedingt einen lokalen Geltungsbereich habe.

Ich möchte immer meine Hilfsfunktion Anruf $apply auf der $rootScope haben, aber nicht, wenn es ein Risiko dabei ist.

+3

Auf den ersten Blick klang das schlecht, aber ein bisschen suchen es sieht aus wie Aufruf von $ apply auf jedem Bereich wird $ rootScope verursachen. $ Verdauen, um irgendwie zu laufen, so glaube ich nicht, dass Sie irgendwelche Leistungsverlust leiden würde, aber es ' d lohnt sich, etwas zu testen http://StackOverflow.com/Questions/12333410/Why-Scope-Apply-Calls-rootscope-Digest-Rather-Than-this-digest – shaunhusain

Antwort

44

Running $apply auf einem beliebigen Bereich ergibt immer eine $rootscope.$digest. Der einzige Fall, in dem es einen Unterschied machen könnte, ist, wenn Sie einen Ausdruck als Argument für $apply bereitstellen. Der Ausdruck wird im aktuellen Umfang ausgewertet (vs. $ rootScope), aber danach wird $rootscope.$digestimmer genannt.

Der Quellcode ist ganz klar: rootScope.js

Fazit: Wenn Sie $apply ohne Argumente nennen, macht es keinen Unterschied.

+5

Es macht einen Unterschied, wenn der Code vor der Anwendung ohne Parameter eine Ausnahme auslöst. Diese Ausnahme wird nicht von der Fehlerbehandlung des Winkels abgefangen. –

+0

Heißt das, es gibt einen Unterschied zwischen 'thisThrowsAnError(); $ scope. $ Apply()' und 'thisThrowsAnError(); $ rootScope. $ Apply()'? –

+6

Ich bezog mich auf $ anyScope. $ Apply (function() {/ * löst Fehler * /}) vs/* thorws Fehler * /; $ anyScope. $ Apply(). Letzteres ist nicht durch Fehlerhandler von Winkel –

15

Ein weiterer Grund für $apply auf dem $rootScope statt $scope kommt in der Regel für mich laufen, wenn ich $apply in einem Dienst aufrufen müssen, die von verschiedenen Controllern genutzt werden und damit unterschiedliche Bereiche.
In diesen Fällen bevorzuge ich es, die $rootScope in den Dienst zu injizieren und $ apply darauf anzurufen, ohne sich Gedanken darüber machen zu müssen, in welchen Bereichen der Dienst in Zukunft verwendet wird.

+3

Großartig Punkt .. in der Tat Passing Umfang zu einem Dienst sollte wirklich ein dokumentiertes Anti-Muster sein –

Verwandte Themen