【问题标题】:Is there a way to block an angular service injection until the service's async data are loaded有没有办法在加载服务的异步数据之前阻止角度服务注入
【发布时间】:2014-02-21 10:41:52
【问题描述】:

我有一个“userSessionDataService”。这会从服务器获取用户的详细信息(仅一次)。

我希望在调用服务时可以访问用户数据,但不需要在 promise 上调用 .then()。

据我了解,Angular 不支持这一点。服务的调用者必须始终使用承诺来访问异步加载的数据(例如通过 ajax)。

【问题讨论】:

  • 我同意这是不可能的。我不知道这是您真正想要的设计 - 导致您的应用程序在等待异步资源的基本级别上阻塞。
  • 我遇到了同样的问题。我解决了它,并正在研究我的答案。给我几分钟。
  • 更容易提供这个链接:stackoverflow.com/questions/16286605/…
  • 我所做的不同。当他们登录时,我将用户数据存储在localStorage 中。启动时,我检查它是否在 localStorage 中并且它没有过期。如果它丢失或过期,我在module().run() 中使用$location.path('/SignIn'); 如果您仍然感兴趣,我可以在答案中拼凑出我是如何做到的。
  • @Nathaniel Johnson 我可以从上面的链接中了解到,我需要在每条需要 userSessionDataService 的路由中使用解析?这意味着无处不在。

标签: angularjs service promise inject


【解决方案1】:

您可能会发现手动引导很有用,就像我为本地化所做的那样:

$(function(){
    $.ajax({
        url: "/GetResources",
        type: "POST",
        dataType: 'json',
        contentType: "application/json; charset=utf-8",
        success: function(result) {
            var mn = 'app';
            angular.module(mn).value('Resources', result);
            angular.bootstrap(document, [mn]);
        }
    });
});

资源总是以这种方式可用:

angular.module('app').run(function($rootScope, Resources){
     $rootScope.resources = Resources;
});

【讨论】:

  • 我只是想知道为什么角度生命周期不支持这样的初始化。
  • 我喜欢这个答案。我只想补充一点,您可以在module().config() 中执行类似的操作,因此可以访问$http,并且承诺将在module().run() 执行时实现。
  • @Nathaniel Johnson 你可以用这样的代码发布答案吗?
  • 当然,给我一点,这样我也可以创建一个 plunker。
  • 如果你想重新发布,这是我搞砸的 plunkr。 plnkr.co/edit/aIMMoBd78hqTvtPeL2Nx?p=preview
猜你喜欢
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 2013-06-23
相关资源
最近更新 更多