Javascript AngularJS$范围继承服务

Javascript AngularJS$范围继承服务,javascript,angularjs,inheritance,angularjs-service,Javascript,Angularjs,Inheritance,Angularjs Service,我的代码有点问题。我无法在我的数据服务中传递或记录继承的$scope.user。因为我在另一种情况下也遇到了这个问题,看起来是一样的,我想这是因为回调 主控制器创建用户 数据服务 .service('dataService', function ($http) { this.getUser = function (callback) { $http.get('mock/user.json') .then(callback) };

我的代码有点问题。我无法在我的数据服务中传递或记录继承的$scope.user。因为我在另一种情况下也遇到了这个问题,看起来是一样的,我想这是因为回调

主控制器创建用户

数据服务

    .service('dataService', function ($http) {
    this.getUser = function (callback) {
        $http.get('mock/user.json')
            .then(callback)
    };
导航控制器(mainCtrl的子项):


您可以猜到,如果我手动设置$scope.user,它就可以正常工作。

似乎控制器的“mainCtrl”和“navCtrl”有不同的作用域。如果“navCtrl”的作用域是“mainCtrl”作用域的子项,则可以使用
$scope.$parent.user

在解析承诺时触发日志记录
$scope.$parent.$watch('user',function(newVal){console.log(newVal)})

如果没有,我建议使用某种上下文,在其中存储不同控制器使用的数据


要查找作用域,您可以使用
angular.element('[ng controller=“mainCtrl”]').scope()
,即使在浏览器控制台中也是如此。您可以做的是从$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;
   });
});

})

两个控制器的作用域将不同,因此如果在另一个控制器中定义,则不会在其中定义。如果您希望它在这两种情况下都能工作,只需使用dataService即可

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

然后分别在每个控制器中访问它,这两个控制器都可以使用。

很抱歉,我不明白您从$http.get返回承诺的意思,而不是直接在回调中设置scope.user。然后将对getNavItems的调用封装在承诺中。你的意思是我应该返回$http.get值?在答案中添加了一个示例;注意,在getUser中,我们返回$http.get的结果,这将是一个承诺。在mainCtrl中,您只需在scope上设置promise,而在navCtrl中,您只需在我们在scope上设置的promise对象的上下文中进行操作。但是,如何将$scope.user保留在主控制器中,因为我需要所有子控制器中的用户。
.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;
   });
});
 .service('dataService', function ($http) {
    this.getUser = function () {
       $http.get('mock/user.json').then(function(data) {
          this.user = data;
       )}
};