如何在 AngularJS 中“急切加载”服务? (在需要之前自动实例化它)

Posted

技术标签:

【中文标题】如何在 AngularJS 中“急切加载”服务? (在需要之前自动实例化它)【英文标题】:How to "eager load" a service in AngularJS? (instantiate it before its needed, automatically) 【发布时间】:2013-03-11 05:14:28 【问题描述】:

我正在尝试实现这样的程序结构:

这里的问题是,当一开始没有明显的控制器使用Features时,它们没有被实例化并且没有在FeatureRegistry中注册,因此它们不能显示在视图中。但我想要实现的是它们显示在视图中,然后通过ng-include 加载模板,然后在模板中为每个功能都有特定的控制器。这些控制器是使用功能的控制器。

这些功能基本上只是用来说明模板和图标的位置、使用哪个以及启动功能的开始。

但回到我最初的问题:即使目前不需要服务,如何实例化服务?

或者是否有其他功能可以用来代替服务?如果你指点我,我也想:)

【问题讨论】:

【参考方案1】:

您可以在应用程序的run 部分中请求它,注入器将调用它。

angular.module("myApp", []).
    factory("EagerService", function () 
        console.log("I'm ready.");
    ).
    run(function (EagerService) 
        console.log("EagerService is ready.");
    );

然而,据我了解,您有需要此EagerService 的子/子控制器。为什么不把它注入那里?

【讨论】:

必须先包含它们,FeatureViewController .. 他应该在控制器的视图中包含模板 如果你使用webpack,你需要在run里面至少有一行代码,因为如果没有代码,webpack不会进入功能。所以,就我而言,我使用return; 而不是console.log【参考方案2】:

(因为这是相对较旧的 - 这个答案是为未来的读者准备的 - 但我偶然发现了这个问题,所以也许其他人也会)如果您使用提供者/配置块 - 它们是急切完成的,所以最好进行急切的初始化那里的代码。您正在/可能正在考虑服务/运行块。

用代码来演示,这个警报不会弹出(假设myServiceModule是你的应用程序依赖的一个模块并且myService没有被注入任何地方):

angular.module('myServiceModule', []).service('myService', function () 
    alert("service");

    // service
    return ;
);

但是即使没有人依赖myProvider 服务,也会弹出此警报

angular.module('myProviderModule', []).provider('myProvider', function () 
    alert("provider");

    // Define your service here. Can be an array of inject-ables 
    // instead of a function.
    this.$get = function () 
        // service
        return ;
    ;
);

您可以在plunker 中看到这一点。

在官方文档here 中了解有关提供程序的更多信息。

【讨论】:

以上是关于如何在 AngularJS 中“急切加载”服务? (在需要之前自动实例化它)的主要内容,如果未能解决你的问题,请参考以下文章

Ruby:如何在模块加载到其父类中之前急切加载类内容

如何在 LINQ 中急切加载整个 SQL 表?

在 EFCore 急切加载 LINQ 查询中,如何在 ThenInclude() 表达式中引用***实体?

WCF 数据服务和 EF4 CTP5,如何为查询配置默认的急切加载模式?

如何在 has_many 关系中急切加载最新的对象?

如何在 Laravel 中为 ORM 急切加载添加多个键约束?