L'associazione bidirezionale è limitata quasi esclusivamente agli elementi che utilizzano ng-model
. La direzione che va dalla vista al modello utilizza i gestori di eventi standard per rilevare le modifiche che devono essere aggiornate all'interno del modello (ad es., onchange
). La direzione che va dal modello alla vista viene aggiornata durante lo $digest
. Ma non chiamiamo direttamente il numero $digest
.
Ogni elemento presente nella pagina che risponderà al ciclo di digest assegnerà, da qualche parte, un listener e un'espressione al suo ambito utilizzando $watch
. Quando si scrive {{ foo() }}
o quando si utilizza ng-model='user.name'
, internamente viene effettuata una chiamata a $watch
effettuata per conto dell'utente con un'espressione Javascript che verrà eseguita ogni volta che viene eseguito un ciclo di digest.Questa registrazione potrebbe avvenire durante la compilazione del modello (il nostro primo esempio), oppure potrebbe accadere durante la fase di collegamento di una direttiva (la nostra seconda).
Non c'è magia qui. Gli ascoltatori collegati sono funzioni regolari: nel nostro esempio, l'ascoltatore per l'espressione foo()
viene fornito per te e aggiornerà il testo html sulla pagina, mentre l'ascoltatore per l'espressione user.name
chiamerà setText
o setOption
, o qualunque cosa sia richiesta dal particolare input che è stato allegato a ng-model
.
Mentre angolare è in grado di gestire la maggior parte dell'ascolto, è possibile collegare manualmente le proprie espressioni dell'orologio con i propri ascoltatori all'interno di qualsiasi funzione che abbia accesso a un ambito (lo scopo è importante perché abbatteremo quegli osservatori se le parti corrispondenti di la pagina è stata rimossa). Stai attento all'eccesso. I collegamenti non sono gratuiti e più cose sono vincolate, più lentamente la pagina risponderà. I collegamenti una tantum sono un modo per ridurre questo costo. L'utilizzo di $on
con $emit
e $broadcast
è un altro.
Quindi quando viene chiamato digest? Non è certamente automatico. Se il ciclo di digest è in esecuzione, significa qualcuno da qualche parte chiamato $apply
sul loro ambito o sull'ambito di base. ng-model
allega i gestori che risponderanno ai normali eventi html e invieranno chiamate a $apply
per conto dell'utente. Ma foo()
, d'altro canto, non verrà mai chiamato fino a quando qualche altro bit di script chiama da qualche parte $apply
. Fortunatamente, la maggior parte delle funzioni che componi per avvolgere angolarmente quelle funzioni con una chiamata a $apply
, così spesso non devi effettuare la chiamata tu stesso (ad esempio, $timeout
è avvolto con $apply
, motivo per cui lo usiamo invece di setTimeout
) . Ma se stavi usando qualcosa che non rientri nel campo angolare (una libreria di terze parti che si collega agli eventi), dovresti ricordarti di chiamare tu stesso lo $apply
e, come sopra, puoi farlo manualmente chiamando lo $apply
ovunque tu abbia accesso ad un ambito.
fonte
2015-05-24 16:17:37