mirror of
https://github.com/zhigang1992/angular.js.git
synced 2026-04-02 09:00:34 +08:00
fix($evalAsync): have only one global async queue
Having one async queue per scope complicates the matters when users wish to do partial scope updates, since many services put events on the rootScope. By having single queue the programing model is simplified.
This commit is contained in:
@@ -195,7 +195,6 @@ function $RootScopeProvider(){
|
||||
child['this'] = child;
|
||||
child.$$listeners = {};
|
||||
child.$parent = this;
|
||||
child.$$asyncQueue = [];
|
||||
child.$$watchers = child.$$nextSibling = child.$$childHead = child.$$childTail = null;
|
||||
child.$$prevSibling = this.$$childTail;
|
||||
if (this.$$childHead) {
|
||||
@@ -362,7 +361,7 @@ function $RootScopeProvider(){
|
||||
$digest: function() {
|
||||
var watch, value, last,
|
||||
watchers,
|
||||
asyncQueue,
|
||||
asyncQueue = this.$$asyncQueue,
|
||||
length,
|
||||
dirty, ttl = TTL,
|
||||
next, current, target = this,
|
||||
@@ -371,18 +370,19 @@ function $RootScopeProvider(){
|
||||
|
||||
beginPhase('$digest');
|
||||
|
||||
do {
|
||||
do { // "while dirty" loop
|
||||
dirty = false;
|
||||
current = target;
|
||||
do {
|
||||
asyncQueue = current.$$asyncQueue;
|
||||
while(asyncQueue.length) {
|
||||
try {
|
||||
current.$eval(asyncQueue.shift());
|
||||
} catch (e) {
|
||||
$exceptionHandler(e);
|
||||
}
|
||||
|
||||
while(asyncQueue.length) {
|
||||
try {
|
||||
current.$eval(asyncQueue.shift());
|
||||
} catch (e) {
|
||||
$exceptionHandler(e);
|
||||
}
|
||||
}
|
||||
|
||||
do { // "traverse the scopes" loop
|
||||
if ((watchers = current.$$watchers)) {
|
||||
// process our watches
|
||||
length = watchers.length;
|
||||
|
||||
@@ -441,7 +441,7 @@ describe('Scope', function() {
|
||||
child.$evalAsync(function(scope) { log += 'child.async;'; });
|
||||
child.$watch('value', function() { log += 'child.$digest;'; });
|
||||
$rootScope.$digest();
|
||||
expect(log).toEqual('parent.async;parent.$digest;child.async;child.$digest;');
|
||||
expect(log).toEqual('parent.async;child.async;parent.$digest;child.$digest;');
|
||||
}));
|
||||
|
||||
it('should cause a $digest rerun', inject(function($rootScope) {
|
||||
|
||||
Reference in New Issue
Block a user