$watch, $apply, $digest


$watch, $apply in $digest so trije koncepti, ki poganjajo AngularJS in omogočajo, da se neka stvar tako avtomagično pojavi na spletni strani. Ta zapis je namenjen tistim, ki so za te koncepte že slišali in jih še niso čisto osvojili.

Z $watch opazujemo neko spremenljivko in ko se njena vrednost spremeni, se sproži funkcija, ki obravnava spremembo (rokovalnik). Kdaj se vrednost neke spremenljivke spremeni, pa Angular ugotovi med zagonom $digest zanke.

Ta $digest zanka se sprehodi skozi vse spremenljivke, ki se nahajajo na t.i. $watch seznamu (vse spremenljivke, ki jih Angular opazuje) in je del Angular konteksta. Na tem seznamu imamo za vsako spremenljivko poleg njenega imena še njeno staro ter novo vrednost. Samo če sta si vrednosti neke spremenljivko različni, se sproži rokovalnik za to spremenljivko.

Samo če se v obhodu $digest zanke sprožil najmanj en rokovalnik, se $digest zanka znova zažene – rokovalnik je lahko spremenil vrednost spremenljivke na $watch seznamu.

Skoraj vsa vgrajene Angular direktive, storitve, vgrajene funkcije (npr. $watch) za nas na koncu izvajanja sprožijo $digest zanko, kdaj pa moramo tudi sami ročno zagnati to zanko. Na primer takrat, ko se odzivamo na dogodke in pri poslušanju ne uporabljamo Angular funkcij, ki bi na koncu namesto nas zaganjale $digest zanko (ali drugače: če je neka spremenljivka na $watch seznamu, še ne pomeni, da se bo sprememba avtomatsko zaznala, nekdo mora zagnati $digest zanko).

Za zagon te zanke uporabimo $apply – funkcijo lahko kličemo brez argumenta (ekvivalentno klicanju $digest) ali pa ji podamo funkcijo, ki izvede ukaze v Angular kontekstu (po vseh izvedenim ukazih sama kliče $digest).