为什么需要使用' timeout'在角度

时间:2014-03-28 09:37:11

标签: javascript angularjs

这可能是一个全新的问题......道歉,但我无法理解它。

在很多角度文档/示例中,我看到异步函数包含在' timeout'块。许多都包含在setTimeout()中,需要明确使用

if (!$scope.$$phase) {
    $scope.$apply();
}

鉴于angular提供$ timeout,上面的代码似乎过时或错误,并且在角度内使用$ timeout应始终是首选。但是,我离题了。

以下是一些示例代码摘录:http://markdalgleish.com/2013/06/using-promises-in-angularjs-views/

var myModule = angular.module('myModule', []);
// From this point on, we'll attach everything to 'myModule'

myModule.factory('HelloWorld', function($timeout) {
  var getMessages = function(callback) {
    $timeout(function() {
      callback(['Hello', 'world!']);
    }, 2000);
  };

  return {
    getMessages: getMessages
  };
});

我看到在超时块中的代码包装到处都是特别与异步调用相关的。但有人可以解释为什么需要它吗?为什么不将上面的代码更改为:

var myModule = angular.module('myModule', []);
// From this point on, we'll attach everything to 'myModule'

myModule.factory('HelloWorld', function() {
  var getMessages = function(callback) {
    callback(['Hello', 'world!']);
  };

  return {
    getMessages: getMessages
  };
});

为什么上面的代码段不能正常工作?

2 个答案:

答案 0 :(得分:0)

$timeout$interval的使用是隐式触发摘要周期。过程如下:

  • 执行回调函数中的每个任务
  • 执行每项任务后调用$apply
  • $apply触发摘要周期

如果您使用的服务不会触发$rootScope周期,则可以选择注入$rootScope.$digest()并调用$digest

  

Angular使用脏检查摘要机制来监视和更新范围的值   处理您的申请。摘要通过检查所有正在进行的值来工作   观察他们之前的价值并运行为这些人定义的任何手表处理程序   已更改的值。

     

通过在作用域对象上调用$digest来触发此摘要机制。通常你不需要   手动触发摘要,因为每个可以触发更改的外部操作   应用程序,如鼠标事件,超时或服务器响应,包装Angular应用程序代码   在代码块中,代码完成时将运行$digest

<强>参考

答案 1 :(得分:0)

示例中的$timeout可能仅用于模拟异步函数,例如$http.get。至于为什么$timeout而非setTimeout$timeout会自动告知角度更新模型,而无需调用$scope.$apply()

另外,请考虑以下示例:

$scope.func = function(){
    $scope.showSomeLoadingThing = true;
    //Do some long-running stuff
    $scope.showSomeLoadingThing = false;
}

不会显示加载的东西,你必须这样写:

$scope.func = function(){
    $scope.showSomeLoadingThing = true;
    $timeout(function(){
        //Do some long-running stuff
        $scope.showSomeLoadingThing = false;
    });
}