在 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 = 测试;