Can';t访问AngularJS中作用域的值。控制台日志返回未定义的

Can';t访问AngularJS中作用域的值。控制台日志返回未定义的,angularjs,angularjs-scope,Angularjs,Angularjs Scope,我正在为我的应用程序使用ui路由器,并在ui视图中嵌套控制器。我的父控制器如下所示: 'use strict'; angular.module("discussoramaApp").controller("mainController", ["RestFullResponse", "Restangular", "localStorageService", "$scope", function(RestFullResponse, Restangular, localStorageService,

我正在为我的应用程序使用ui路由器,并在ui视图中嵌套控制器。我的父控制器如下所示:

'use strict';

angular.module("discussoramaApp").controller("mainController", ["RestFullResponse", "Restangular", "localStorageService", "$scope", function(RestFullResponse, Restangular, localStorageService, $scope){

  var currentId = localStorageService.get("***");

  var user = Restangular.one("users", currentId);
  var Profile = user.get({}, {"Authorization" : localStorageService.get('***')}).then(function(profile) {
    $scope.profile = profile;
  });

}]);
和我的孩子控制器:

'use strict';

angular.module("discussoramaApp").controller("getTopicsController", ["RestFullResponse", "Restangular", "localStorageService", "$scope", function(RestFullResponse, Restangular, localStorageService, $scope){

  var topics = Restangular.all('topics');
  var allTopics = topics.getList({},{"Authorization" : localStorageService.get('***')}).then(function(topics){
    $scope.topics = topics;
  });

  console.log($scope); // this works
  console.log($scope.profile); // this returns undefined

}]);
我遇到的问题是在子控制器中为概要文件获取继承的$scope值。当我记录$scope时,概要文件在控制台中清晰可见

但当我尝试记录$scope.profile时,控制台返回undefined。有什么想法吗

编辑:添加我的ui路由器配置

angular.module("discussoramaApp").config(
  function($stateProvider, $urlRouterProvider){
    $urlRouterProvider.otherwise('/home');
    $urlRouterProvider.when('', '/home');

    $stateProvider

      .state('main',{
        url: '',
        templateUrl: 'partials/main.html',
        requireLogin: true
      })

      .state('main.home',{
        url: '/home',
        templateUrl: 'partials/main.home.html',
        requireLogin: true,
        title: 'Home'
      });

  }
);
以及相应的html文件:

// main.html
<div ng-controller="mainController">

  <div class="container">
    <div ui-view></div>
  </div>

</div>

仅仅因为您有嵌套的作用域,并不意味着它将等待
user.get()
返回,然后再实例化嵌套的
getTopicController

你的问题是:

  • mainController
    controller初始化并调用
    user.get()
  • getTopicController
    初始化并记录
    console.log($scope.profile)
  • 调用
    user.get()
    返回并设置作用域
  • 这是一个常见问题,如果需要查看设置了
    $scope.profile
    ,请使用或查看变量


    实际上,我在今天早些时候给出了一个如何执行此操作的示例:

    $scope.profile
    是在异步请求之后设置的,因此我怀疑第二个控制器是在
    user.get()
    返回并为
    $scope.profile
    赋值之前实例化的

    我认为您需要在子控制器中设置一个监视程序(如
    $scope.$watch('profile',function(profile){});
    ),以便在配置文件可用或更改时执行操作

    此外,当您在控制台上记录
    $scope
    时,您可以在
    $scope
    上看到
    配置文件
    键的原因可以在此处解释:。您需要使用
    console.dir()
    来获取调用对象时的当前状态

    更新:

    我刚刚意识到你正在使用ui路由器,所以有一个更简单的方法来实现这一点。ui路由器有一个
    resolve
    对象,您可以使用它向控制器中注入类似的依赖项。每个resolve函数只需要返回一个值或一个承诺,就可以使用resolve key name将其注入控制器。对您来说,它是这样的:

    angular.module("discussoramaApp").config(
      function($stateProvider, $urlRouterProvider){
        $urlRouterProvider.otherwise('/home');
        $urlRouterProvider.when('', '/home');
    
        $stateProvider
    
          .state('main',{
            url: '',
            templateUrl: 'partials/main.html',
            requireLogin: true,
            resolve: {
              profile: ['Restangular', 'localStorageService', function(Restangular , localStorageService) {
                var currentId = localStorageService.get("***");
                var user = Restangular.one("users", currentId);
                return user.get({}, {"Authorization" : localStorageService.get('***')});
              }
            }
          })
    
          .state('main.home',{
            url: '/home',
            templateUrl: 'partials/main.home.html',
            requireLogin: true,
            title: 'Home'
          });
    
      }
    );
    
    angular.module("discussoramaApp").controller("mainController", ["profile", "$scope", function(profile, $scope){
      $scope.profile = profile;
    }]);
    

    请发布一个blub,显示您的
    ui路由器
    config。添加了ui路由器配置和部分。谢谢。我在下面贴了一个答案。啊,谢谢,我仍然对手表和决心有点迷茫。但是我让它工作了。我想我需要多读一点文档中的$scope。嗯,我的手表还是有问题。我知道这是正确的做法,只是不知道如何实施。我在问题的末尾添加了一些代码,看看我是否做得对。我设置了一个监视程序,但却抛出了一个错误。你能看一看问题出在哪里吗?是的,我忘了提到最初配置文件的值是
    null
    $scope.$watch('profile', function(profile) {
      if(profile) {
        $window.document.title = "Discussorama | " + profile.user.name;
      }
    });
    
    angular.module("discussoramaApp").config(
      function($stateProvider, $urlRouterProvider){
        $urlRouterProvider.otherwise('/home');
        $urlRouterProvider.when('', '/home');
    
        $stateProvider
    
          .state('main',{
            url: '',
            templateUrl: 'partials/main.html',
            requireLogin: true,
            resolve: {
              profile: ['Restangular', 'localStorageService', function(Restangular , localStorageService) {
                var currentId = localStorageService.get("***");
                var user = Restangular.one("users", currentId);
                return user.get({}, {"Authorization" : localStorageService.get('***')});
              }
            }
          })
    
          .state('main.home',{
            url: '/home',
            templateUrl: 'partials/main.home.html',
            requireLogin: true,
            title: 'Home'
          });
    
      }
    );
    
    angular.module("discussoramaApp").controller("mainController", ["profile", "$scope", function(profile, $scope){
      $scope.profile = profile;
    }]);