2016-02-12 138 views
1

我的代碼有些問題。我無法在我的數據服務中傳遞或console.log繼承的$ scope.user。由於我在另一種看起來相同的情況下也遇到了這個問題,我想這是因爲回調。

主控制器創建用戶

.controller('mainCtrl', function ($scope, dataService) { 
    dataService.getUser(function (response) { 
     $scope.user = response.data[0]; 
    }) 

DataService在

導航控制器(mainCtrl的孩子):

.controller('navCtrl', function ($scope, dataService) { 
    //$scope.user = "test"; 
    console.log ($scope.user); 
    dataService.getNavItems($scope.user,function (response) { 
     $scope.navItems = response.data; 
    }); 

正如你所想,如果我手動設置$ scope.user它工作得很好。

回答

1

的承諾時navCtrl被實例化尚未解決。你可以做的是從$ http.get中返回承諾,而不是直接在回調中設置scope.user。然後,只需將該呼叫包裝到承諾中的getNavItems即可。

這是假設,navCtrl是MainCtrl

.service('dataService', function ($http) { 
    this.getUser = function() { 
    return $http.get('mock/user.json'); 
    }}; 

.controller('mainCtrl', function ($scope, dataService) { 
    $scope.userPromise = dataService.getUser(); 
}) 

.controller('navCtrl', function ($scope, dataService) { 
    $scope.userPromise.then(function(response) { 
    var user = response.data[0]; 
    dataService.getNavItems(user, function (response) { 
     $scope.navItems = response.data; 
    }); 
}); 

})

+0

對不起,我不明白你的意思*從$ http.get返回承諾,而不是直接在回調中設置scope.user。然後,將調用包裝到promise中。getNavItems *您的意思是我應該返回$ http.get值? – GruberEDU

+0

爲答案增加了一個例子;請注意,在getUser中,我們返回$ http.get的結果,這將是一個承諾。在mainCtrl中,您只需在範圍和navCtrl中設置承諾,您只需在範圍內設置的承諾對象的上下文中操作。 – willz

+0

好吧,它的工作原理。但是我如何將$ scope.user保存在主控制器中,因爲我需要所有子控制器中的* user *。 – GruberEDU

0

似乎控制器的'mainCtrl'和'navCtrl'有不同的作用域。如果「navCtrl」範圍的「mainCtrl」範圍的孩子,你可以用$scope.$parent.user

訪問它要觸發記錄時承諾解決$scope.$parent.$watch('user', fucntion(newVal){console.log(newVal)})

如果沒有,我會建議有一些上下文類型,您可以在其中存儲不同控制器使用的數據。

要查找的範圍,你甚至可以在瀏覽器控制檯使用angular.element('[ng-controller="mainCtrl"]').scope()

1

範圍將是兩個控制器不同的子項,因此它不會在一個定義,如果你將它定義在另一個。如果你想讓它在兩者中工作,只需使用dataService。

.service('dataService', function ($http) { 
    this.getUser = function() { 
     $http.get('mock/user.json').then(function(data) { 
      this.user = data; 
     )} 
}; 

然後分別在每個控制器中訪問它,它將可用於兩者。