2013-07-25 15 views
33

La funzione $apply può essere eseguita su qualsiasi ambito, incluso $rootScope.

Ci sono casi in cui fa la differenza se lo eseguo sul mio scope locale o se lo eseguo sul mio $rootScope?

Sto chiedendo perché mi piacerebbe creare una funzione di supporto che avvolge una determinata funzione in un $apply. Per farlo avrei sempre bisogno di passare un ambito, che è A) fastidioso e B) non facile perché non ho necessariamente un ambito locale.

Mi piacerebbe avere sempre la mia funzione di supporto chiamata $apply su $rootScope, ma non se c'è qualche rischio nel farlo.

+3

All'inizio pensavo che suonasse male ma cercando un po 'sembra che chiamare $ apply su qualsiasi scope stia causando $ rootScope. $ Digest per funzionare in ogni caso quindi non credo che subirai alcuna perdita di prestazioni, ma e' Vale la pena provare alcuni http://stackoverflow.com/questions/12333410/why-scope-apply-calls-rootscope-digest-rather-than-this-digest – shaunhusain

risposta

44

L'esecuzione di $apply su qualsiasi ambito produce sempre un $rootscope.$digest. L'unico caso in cui potrebbe fare la differenza è quando fornisci un'espressione come argomento a $apply. L'espressione verrà valutata nell'ambito corrente (rispetto a $ rootScope), ma successivamente $rootscope.$digest è sempre chiamato.

Il codice sorgente è abbastanza chiaro: rootScope.js

Bottom line: Se si chiama $apply senza argomenti, non fa alcuna differenza.

+5

Fa la differenza se il codice prima dell'applicazione senza parametro genera un'eccezione. Questa eccezione non viene catturata dalla gestione degli errori angolari. –

+0

Stai dicendo che c'è una differenza tra 'thisThrowsAnError(); $ scope. $ Apply()' e 'thisThrowsAnError(); $ rootScope. $ Apply()'? –

+6

Mi riferisco a $ anyScope. $ Apply (function() {/ * genera errore * /}) vs/* thorws error * /; $ anyScope. $ Apply(). Quest'ultima non è passata attraverso il gestore degli errori di angolare –

15

Un altro motivo per l'esecuzione $apply sulla $rootScope invece di $scope viene in genere per me quando ho bisogno di chiamare $apply in un servizio che sarà utilizzato da diversi controllori e quindi diversi ambiti.
In questi casi preferisco iniettare il servizio $rootScope e chiamare $ apply su di esso senza preoccuparsi di quali ambiti il ​​servizio verrà utilizzato in futuro.

+3

punto .. in effetti passare l'ambito ad un servizio dovrebbe essere davvero un anti-pattern documentato –

Problemi correlati