【问题标题】:Angular bootstrap lifecycle: Run code after full loadAngular 引导生命周期:完全加载后运行代码
【发布时间】:2014-12-11 18:11:34
【问题描述】:

Angular 为应用程序模块定义了一个 run() 块。这在config() 之后和加载任何控制器和指令之前运行。

在加载所有控制器、指令、服务等之后,生命周期中是否有一个步骤来运行某些东西?

我需要这个才能在我的授权 pubsub 服务中广播消息,并且我想确保在发布消息之前加载所有内容。虽然我可以在运行块中检查身份验证(基本上,只是通过我的身份验证服务检查 JWT 的本地存储),但如果我在 run() 块中发布,我无法确定是否所有内容都已加载。我想知道 Angular 是否公开了类似的东西,或者我是否需要找到不同的解决方案。

谢谢!

【问题讨论】:

  • 我会说您可能会遇到问题,因为某些控制器可能在用户操作之前不会加载。例如,您可以 ng-repeat 来创建指令的多个实例。 ng-repeat 将随着时间的推移创建指令的新实例,可能会生成新的范围等。
  • 在您的评论中,您表示要发布身份验证信息。我建议为此使用服务,其他服务或控制器注入该服务以确定身份验证状态。这将可靠地为依赖项提供正确的信息。您可以创建一个返回承诺的身份验证服务。然后每个人都可以根据该承诺的结果做出反应。
  • @jazeee 我的身份验证服务返回一个承诺,因为它用于对服务器进行身份验证。但是,我的授权服务负责在任何给定时间(通过 JWT)检查我们是否有授权用户以及该用户的权限是什么。我正在使用 pubsub/broadcast,因为权限和登录状态可以随时更改;因此,promise 在这里不起作用(因为我需要倾听变化)。如果发生更改,我会广播该事件,以便应用程序中的所有内容都可以相应地响应。我遇到的问题是在加载时这样做。
  • 顺便说一句,计数为零的$timeout 在运行块中似乎确实有效,但它是一个幼稚的实现(并且存在显示闪烁)。我不认为这是一个有保证的解决方案。
  • 可能是鸡蛋问题。我能想到的一种方法是“发布通知,告诉侦听器检查新更新”以及“每个侦听器在实例化时检查身份验证状态”。这种组合解决了这两种情况。例如。如果 service1 在 Auth 之前启动,它将在 Authentication 发生时得到通知。如果控制器在 Auth 之后启动,它会检查状态,但也会监听以后的变化。如果 Auth 发生变化,它将通知所有侦听器。换句话说,将其分解为“监听事件”,以及“创建时初始化”。也许创建 AuthState 服务

标签: javascript angularjs


【解决方案1】:

可选答案,取自here

您可以使用自定义 postDigest 回调。如果您只需要 first postDigest 回调,请添加一个标志以表明它发生了

function postDigest(callback){    
  var unregister = $rootScope.$watch(function(){  
    unregister();
    $timeout(function(){
      callback();
      postDigest(callback);
    },0,false);       
  });
}

postDigest(function(){
  console.log('do something');
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-12
    • 2014-04-25
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2017-01-18
    相关资源
    最近更新 更多