这可能是一个全新的问题......道歉,但我无法理解它。
在很多角度文档/示例中,我看到异步函数包含在' 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
};
});
为什么上面的代码段不能正常工作?
答案 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;
});
}