【问题标题】:Unable to get $rootscope object on pageload in angularjs无法在 angularjs 中的页面加载时获取 $rootscope 对象
【发布时间】:2015-04-29 12:44:58
【问题描述】:

我正在使用 ng-token-auth 并设计 token-auth。

当用户登录时,它将 user.id 存储在 $rootScope 中

这是我的控制器

app.controller('MyCtrl', function($rootScope,MyFactory){
     console.log($rootScope);
     console.log($rootScope.user.id);
})

第一个的输出是:

对象 {$id: 1, $$childTail: 对象, $$childHead: 对象, $$prevSibling: null, $$nextSibling: null…}
第二次的输出是:
未定义

但是当我们展开第一个输出时,它包含 user.id
用户:对象
配置名称:“默认”
电子邮件:“abc@gmail.com”
编号:3
提供者:“电子邮件”
登录:真
状态:空
uid:“17d851ed-4”
proto:对象

【问题讨论】:

  • 控制器中存储用户数据的代码在哪里?好像你只是分配错了。
  • Devise gem 正在将用户属性分配给 rootscope。我不知道它是怎么做到的。

标签: ruby-on-rails angularjs devise angularjs-scope angular-ui-router


【解决方案1】:

原因可能是您尝试访问尚未分配的属性(可能正在解决承诺或其他什么?)。

为确保,只需在控制器中添加 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();
    }
  });
});

要创建更好的、可重用的功能,您可以创建一个返回承诺的小型服务,如下所示:

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
  });
});

【讨论】:

  • 我在像这样 {{user.id}} 这样的标记中获取 user.id 的值,但不在控制器中
  • 我的猜测是它会在后期更新。尝试在您的控制器中添加此语句:console.log(angular.copy($rootScope.user));
  • 它给出空对象 Object{}
  • 这意味着$rootScope.user 会在稍后阶段更新。为什么你需要把它放在你的控制器中?也许推迟你正在做的事情,直到id 出现?
  • 我想在控制器中获取属于该 user.id 的数据。你能给我一些例子,我该如何推迟
【解决方案2】:

那是因为您必须在以后填充用户。控制台中显示的 chrome 是正确的,因为它具有 $rootScope 的对象引用。因此,您查看的不是控制台记录时的情况,而是现在的情况。

【讨论】:

    【解决方案3】:

    在将用户 ID 分配给 rootscope 时,请按照以下步骤操作

    $rootScope.user = {}; $rootScope.user.id = 测试;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多