如何在 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 中“急切加载”服务? (在需要之前自动实例化它)的主要内容,如果未能解决你的问题,请参考以下文章
在 EFCore 急切加载 LINQ 查询中,如何在 ThenInclude() 表达式中引用***实体?