diff options
Diffstat (limited to 'src/ng/rootScope.js')
| -rw-r--r-- | src/ng/rootScope.js | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index d94a621d..18c54434 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -69,8 +69,8 @@ function $RootScopeProvider(){ return TTL; }; - this.$get = ['$injector', '$exceptionHandler', '$parse', - function( $injector, $exceptionHandler, $parse) { + this.$get = ['$injector', '$exceptionHandler', '$parse', '$browser', + function( $injector, $exceptionHandler, $parse, $browser) { /** * @ngdoc function @@ -666,13 +666,16 @@ function $RootScopeProvider(){ * * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only that: * - * - it will execute in the current script execution context (before any DOM rendering). - * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after - * `expression` execution. + * - it will execute after the function that schedule the evaluation is done running (preferably before DOM rendering). + * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after `expression` execution. * * Any exceptions from the execution of the expression are forwarded to the * {@link ng.$exceptionHandler $exceptionHandler} service. * + * __Note:__ if this function is called outside of `$digest` cycle, a new $digest cycle will be scheduled. + * It is however encouraged to always call code that changes the model from withing an `$apply` call. + * That includes code evaluated via `$evalAsync`. + * * @param {(string|function())=} expression An angular expression to be executed. * * - `string`: execute using the rules as defined in {@link guide/expression expression}. @@ -680,6 +683,16 @@ function $RootScopeProvider(){ * */ $evalAsync: function(expr) { + // if we are outside of an $digest loop and this is the first time we are scheduling async task also schedule + // async auto-flush + if (!$rootScope.$$phase && !$rootScope.$$asyncQueue.length) { + $browser.defer(function() { + if ($rootScope.$$asyncQueue.length) { + $rootScope.$digest(); + } + }); + } + this.$$asyncQueue.push(expr); }, |
