build_your_own_angularjs_sample
build_your_own_angularjs_sample
build_your_own_angularjs_sample
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Build Your Own Angular Chapter 1. Scopes And Digest<br />
Scope.prototype.$digest = function() {<br />
var ttl = 10;<br />
var dirty;<br />
this.$$lastDirtyWatch = null;<br />
this.$beginPhase("$digest");<br />
do {<br />
while (this.$$asyncQueue.length) {<br />
var asyncTask = this.$$asyncQueue.shift();<br />
asyncTask.scope.$eval(asyncTask.expression);<br />
}<br />
dirty = this.$$digestOnce();<br />
if ((dirty || this.$$asyncQueue.length) && !(ttl--)) {<br />
this.$clearPhase();<br />
throw "10 digest iterations reached";<br />
}<br />
} while (dirty || this.$$asyncQueue.length);<br />
this.$clearPhase();<br />
};<br />
Let’s also tweak $apply so that it also sets the phase for itself:<br />
src/scope.js<br />
Scope.prototype.$apply = function(expr) {<br />
try {<br />
this.$beginPhase("$apply");<br />
return this.$eval(expr);<br />
} finally {<br />
this.$clearPhase();<br />
this.$digest();<br />
}<br />
};<br />
And finally we can add the scheduling of the $digest into $evalAsync. Let’s first define<br />
the requirement as a unit test:<br />
test/scope_spec.js<br />
it("schedules a digest in $evalAsync", function(done) {<br />
scope.aValue = "abc";<br />
scope.counter = 0;<br />
scope.$watch(<br />
function(scope) { return scope.aValue; },<br />
function(newValue, oldValue, scope) {<br />
scope.counter++;<br />
}<br />
34 ©2014 Tero Parviainen Errata / Submit