在简化的解释中,我的AngularJS应用程序中有两个嵌套控制器。 ParentController
具有以下代码:
var getUrls = function() {
var deferred = $q.defer();
var url = //someUrl
$http.get(url).success(function(data, status) {
deferred.resolve(data);
});
return deferred.promise;
};
getUrls().then(function(data) {
console.log(data);
$scope.urls = data.urls;
});
ChildController有:
var url = $scope.urls.tasks_list.url;
正如您所看到的,ChildController
尝试访问$scope
属性urls
,该属性仅在其父承诺得到解决时填充。当两个控制器都被执行时(例如用户直接访问子状态),有没有办法告诉Angular只有在填充时才能访问$scope.urls
?
答案 0 :(得分:1)
当然:揭露$ scope中的承诺:
家长控制器:
var getUrls = function() {
var deferred = $q.defer();
var url = //someUrl
$http.get(url).success(function(data, status) {
deferred.resolve(data);
});
return deferred.promise;
};
$scope.urlPromise = getUrls();
$scope.urlPromise.then(function(data) {
console.log(data);
$scope.urls = data.urls;
});
儿童控制器:
$scope.urlPromise.then(function(data) {
doSomethingWith(data.urls.tasks_list.url);
});
请注意,您应该使用promise chaining来简化代码,并确保在http请求失败时拒绝url promise,而不是永久保持挂起:
var getUrls = function() {
var url = //someUrl
return $http.get(url).then(function(response) {
return response.data;
});
};