仅当父控制器填充

时间:2015-07-14 16:53:16

标签: angularjs

在简化的解释中,我的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

1 个答案:

答案 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;
    });
};