各位,我有一个问题。我正在使用 AngularJS,并且正在 Angular 服务定义中设置延迟对象:
angular.module('myServices', []).
service('Brand', function($rootScope, $q){
var service = {
getNext: function() {
var deferred = $q.defer();
setTimeout(function() {
deferred.resolve('foo');
}, 2000);
return deferred.promise;
}
};
return service;
});
该服务在我的 Controller 中使用:
angular.module({
controllers: {
brand: function($scope, Brand) {
$scope.changeBrand = function() {
$scope.brand = Brand.getNext();
}
}
}
}, ['myServices]);
最后 View 等待 Promise 得到解决然后显示它:
<a ng-click="changeBrand()" id="changeBrand">Change</a>
<p ng-bind="brand"></p>
问题在于,虽然 promise 正在得到解决,并且 View 在等待 promise 得到解决并显示结果方面做得很好,但它不会立即执行。仅当我添加此代码并单击链接时它才会显示:
// View:
<a ng-click="apply()">Apply</a>
// Controller:
$scope.apply = function() {
$scope.$apply();
};
promise 所在的摘要部分是否与 View / Controller 范围更改时运行的摘要分开存在?当延迟解析时,如何让摘要在 View / Controller 的作用域上自动运行?
谢谢!
最佳答案
几天前,我在使用 Promise 实现惰性 Controller 时遇到了同样的问题。当您查看有关routeProvider的文档时,有一个使用带有 promise 的$timeout服务的示例( https://github.com/angular/angular.js/blob/master/src/ng/route.js#L186 )。 $timeout 实现使用 $rootScope.$apply() 来调用生命周期并刷新绑定(bind)(据我所知,它调用所有脏检查函数 - 这就是绑定(bind)在 Angular 中的工作方式)。因此,我的问题(我想也是你的问题)的解决方案是在resolve()之后添加$rootScope.$apply(),如下所示:
setTimeout(function() {
deferred.resolve('foo');
$rootScope.$apply();
}, 2000);
关于javascript - 如何将一个范围内的延迟对象集包含在 AngularJS 中另一个范围的摘要中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13500051/