我正在尝试在示波器上观看$ watch,因此我可以听取更改,但是,我不希望手表在数据进入和填充之前开始侦听。我正在使用$ q工厂,然后填充项目,然后我希望手表在填充完所有内容后开始监听。我似乎无法理解如何控制这些事件的顺序。
所以我在我的控制器中 -
//call to the $q factoy to execut all http calls
getDefaults.resource.then(function(data){
//fill in scopes with data
$scope.allAccounts = data[0].data.accounts;
//THEN watch the scope for changes
$scope.$watch('selectedResources', function (newValue) {
//do action on change here
});
}
所以我想知道是否有任何方法可以控制角度的这些事件顺序。谢谢你的阅读!
答案 0 :(得分:1)
您可以为xhr通话创建服务:
.factory('xhrService', function ($http) {
return {
getData: function () {
return $http.get('/your/url').then(cb);
}
};
function cb(data) {
/// process data if you need
return data.accounts;
}
});
之后,您可以在控制器中使用它:
.controller('myController', function (xhrService) {
$scope.allAccounts = [];
xhrService.getData()
.then(function (accounts) {
$scope.allAccounts = accounts;
return $scope.allAccounts;
})
.then(function () {
$scope.$watch('allAccounts', function (newValue) {
// do something
}
});
});
我认为这是构建代码的好方法,因为您可以重用您的服务,并且可以添加(或不添加)您需要的任何手表(在任何控制器内)
最重要的是,来自文档:https://docs.angularjs.org/api/ng/service/ $ q - " $ q.then方法返回新承诺,通过返回值解析或拒绝successCallback,errorCallback" - 这就是为什么每个then callback
都需要一个return语句。