在 angularjs 中无法在页面加载时获取 $rootscope 对象
Unable to get $rootscope object on pageload in angularjs
我正在使用 ng-token-auth 并设计 token-auth。
当用户登录后,它会在 $rootScope
中存储 user.id
这是我的控制器
app.controller('MyCtrl', function($rootScope,MyFactory){
console.log($rootScope);
console.log($rootScope.user.id);
})
第一个输出是:
对象{$id: 1, $$childTail: 对象, $$childHead: 对象, $$prevSibling: null, $$nextSibling: null…}
第二个的输出是:
未定义
但是当我们展开第一个输出时它包含 user.id
用户:对象
配置名称:"default"
电子邮件:"abc@gmail.com"
编号:3
提供商:"email"
登录:真实
状态:空
uid:“17d851ed-4”
原型:对象
那是因为您必须稍后填充用户。 chrome 在控制台中显示的内容是正确的,因为它具有 $rootScope 的对象引用。所以你不是在控制台记录时查看它,而是现在查看它。
原因可能是您正在尝试访问尚未分配的 属性(可能正在解决承诺或其他问题?)。
为了确保,只需在您的控制器中添加一条 debugger
语句,然后查看在给定时刻实际的 user
属性。
要推迟将使用该 user.id
的操作,请尝试以下操作:
app.controller( 'MyCtrl', function( $rootScope, MyFactory ) {
var unwatch = $rootScope.$watch( 'user.id', function ( id ) {
if ( angular.isDefined( id ) {
// use the ID, as it seems to be defined now
console.log( id );
// remove the watch, because there's no more use for it
unwatch();
}
});
});
要创建更好的、可重用的功能,您可以创建一个小型服务来 return 承诺,如下所示:
app.service( 'getUserID', function( $rootScope, $q ) {
var deferred = $q.defer();
var unwatch = $rootScope.$watch( 'user.id', function ( id ) {
if ( angular.isDefined( id ) {
// resolve the promise, as it seems to be defined now
deferred.resolve( id );
// remove the watch, because there's no more use for it
unwatch();
}
});
return function () {
return deferred.promise;
}
});
// let's use it:
app.controller( 'MyCtrl', function( getUserID ) {
// value returned from this service is a promise that will be resolved with user.id
getUserID().then( function ( id ) {
// use the id
});
});
在将用户 ID 分配给 rootscope 时,请按照以下步骤操作
$rootScope.user = {};
$rootScope.user.id = 测试;
我正在使用 ng-token-auth 并设计 token-auth。
当用户登录后,它会在 $rootScope
中存储 user.id这是我的控制器
app.controller('MyCtrl', function($rootScope,MyFactory){
console.log($rootScope);
console.log($rootScope.user.id);
})
第一个输出是:
对象{$id: 1, $$childTail: 对象, $$childHead: 对象, $$prevSibling: null, $$nextSibling: null…}
第二个的输出是:
未定义
但是当我们展开第一个输出时它包含 user.id
用户:对象
配置名称:"default"
电子邮件:"abc@gmail.com"
编号:3
提供商:"email"
登录:真实
状态:空
uid:“17d851ed-4”
原型:对象
那是因为您必须稍后填充用户。 chrome 在控制台中显示的内容是正确的,因为它具有 $rootScope 的对象引用。所以你不是在控制台记录时查看它,而是现在查看它。
原因可能是您正在尝试访问尚未分配的 属性(可能正在解决承诺或其他问题?)。
为了确保,只需在您的控制器中添加一条 debugger
语句,然后查看在给定时刻实际的 user
属性。
要推迟将使用该 user.id
的操作,请尝试以下操作:
app.controller( 'MyCtrl', function( $rootScope, MyFactory ) {
var unwatch = $rootScope.$watch( 'user.id', function ( id ) {
if ( angular.isDefined( id ) {
// use the ID, as it seems to be defined now
console.log( id );
// remove the watch, because there's no more use for it
unwatch();
}
});
});
要创建更好的、可重用的功能,您可以创建一个小型服务来 return 承诺,如下所示:
app.service( 'getUserID', function( $rootScope, $q ) {
var deferred = $q.defer();
var unwatch = $rootScope.$watch( 'user.id', function ( id ) {
if ( angular.isDefined( id ) {
// resolve the promise, as it seems to be defined now
deferred.resolve( id );
// remove the watch, because there's no more use for it
unwatch();
}
});
return function () {
return deferred.promise;
}
});
// let's use it:
app.controller( 'MyCtrl', function( getUserID ) {
// value returned from this service is a promise that will be resolved with user.id
getUserID().then( function ( id ) {
// use the id
});
});
在将用户 ID 分配给 rootscope 时,请按照以下步骤操作
$rootScope.user = {}; $rootScope.user.id = 测试;