2014-05-09 26 views
32

Voglio eseguire una funzione all'interno di una direttiva, ogni volta che si verifica una modifica dello stato nell'ambito genitore.

Il modo più ovvio per ottenere ciò è utilizzare le trasmissioni di eventi ($broadcast) e gli ascoltatori ($on).

Sono curioso di sapere se utilizzare un orologio $ è un'alternativa alla trasmissione di eventi. Se lo è, come si confrontano i due?

Per quanto ho capito, l'espressione da guardare viene valutata ogni ciclo di $ digest. Quindi gli eventi sono più efficienti dell'orologio?

+0

possibile duplicato di [Che cosa è "meno costoso" per le prestazioni $ broadcast o $ watch] (http://stackoverflow.com/questions/19616520/what-is-cheaper-performance-wise-broadcast-or-watch) – Blackhole

risposta

31

La funzione $watch viene utilizzata per controllare le variabili sull'oscilloscopio. L'ereditarietà dell'ambito consente di controllare anche le variabili dell'ambito genitore, quindi questa è sicuramente la strada da seguire per il tuo caso d'uso. Come hai giustamente detto, $on viene utilizzato per guardare gli eventi, che puoi $broadcast per gli ambiti figlio o $emit per gli ambiti padre. Questo ti dà molto più controllo, ma potrebbe causare più errori durante la codifica, dal momento che potresti ottenere un aggiornamento a una variabile di ambito da un punto che non controlli e dimentichi di avvisare gli ascoltatori.

È ancora possibile utilizzare gli eventi quando non si ereditano variabili di ambito. Ma fai attenzione a non inquinare un ambito di grandi dimensioni, utilizzando i servizi potrebbe essere un'opzione lì, perché immediatamente vedere se è iniettato o meno.

Poiché una direttiva ottiene l'ambito su cui si trova (o ne eredita), direi che $watch è un'opzione molto più pulita qui.

Se si desidera avere un ambito isolato sulla direttiva, è possibile passare argomenti come attributi e $observe.

+0

Questa è una spiegazione molto chiara, ma mi mancava il punto qui- "Ma fai attenzione a non inquinare un ambito di grandi dimensioni", vuoi dire di non inquinare con troppi eventi? –

+1

Quando comunichi tra controllori/direttive completamente indipendenti tramite eventi, entrambi devono avere un ambito genitore comune su cui stai trasmettendo. Nella maggior parte dei casi questo sarà il $ rootScope. In un'applicazione di grandi dimensioni, ci si ritroverà con molti eventi sul rootscope e si perderà il controllo su quale componente si sottoscrive a quale evento, mentre con l'iniezione delle dipendenze (e i servizi per la comunicazione) è possibile vederlo immediatamente, ed è molto più facile test/debug. –

+3

Finché si mantiene il controllo stretto, tramite i servizi, del proprio evento di trasmissione, che dovrebbe essere comunque la migliore pratica, direi che i risparmi di rendimento rispetto agli orologi superano tutto il resto. Almeno sulle pagine in cui vi è una quantità non trascurabile di $ orologi (espliciti o impliciti). Come minimo, dovresti fare un conteggio degli orologi per vedere in quale campo ti trovi. – user1821052