Can';t访问AngularJS中作用域的值。控制台日志返回未定义的
我正在为我的应用程序使用ui路由器,并在ui视图中嵌套控制器。我的父控制器如下所示: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,
'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;
}]);