AngularJS Scope Digest recreation
for http://stepansuvorov.com/blog/
by Stepan Suvorov
JavaScript
//(function () {
var rootScope = function () {
this.watchers = [];
};
rootScope.prototype = {
watch: function (watchExp, listener) {
var watcher = {
watchExp: watchExp,
listener: listener,
lastValue: this[watchExp],
};
this.watchers.push(watcher);
},
digest: function () {
var dirty;
do {
dirty = digestOnce(this);
} while (dirty);
function digestOnce(scope) {
var dirty = false;
scope.watchers.forEach(function (watcher) {
if (watcher.lastValue !== scope[watcher.watchExp]) {
watcher.listener.call(scope, scope[watcher.watchExp], watcher.lastValue);
watcher.lastValue = scope[watcher.watchExp];
dirty = true;
}
});
return dirty;
}
}
}
// window.rootScope = rootScope;
//})();
var scope = new rootScope();
scope.x = 5;
scope.watch('x', function (newValue, oldValue) {
alert('changed:' + oldValue + '->' + newValue)
});
scope.x = 10;
scope.digest();
scope.x = 15;
scope.digest();