【问题标题】:Angular Dynamically Inject Module DependencyAngular 动态注入模块依赖
【发布时间】:2015-09-18 09:59:35
【问题描述】:

我为 Umbraco 开发了一个使用 angular 的评论插件。因此,该网站的主要 Angular 应用程序必须注入评论系统模块才能工作。

例如

var theirSite = angular.module('someApp', []);

注入

var theirSite = angular.module('someApp', ['theCommentSystemModule'];

在我的评论系统中,

   angular.module('theCommentSystemModule']....;

我的模块有什么方法可以自动检测 Angular 应用程序并自行注入,而无需更新网站的代码?我希望它只使用脚本链接。

例如:说这些是脚本

<script src="...angular.js">
<script src="...services.js">
<script src="...directives.js">
<script src="...commentsPlugin.js">
<script src="...theirApp.Js">

所以我基本上需要的是,当应用程序被引导时,来自 Angular 的某种回调,所以我可以将评论系统模块作为依赖模块注入应用程序,以便它在引导层中初始化。

或者,或者,我自己在插件中为自己引导页面?是否可以同时运行两个应用程序,例如如果我引导和他们的应用程序也引导的。

【问题讨论】:

  • 这也许适合你试试 ocLazyLoad oclazyload.readme.io/docs/dependency-injection
  • 如果有可以使用的回调就好了,比如 angular.appInitializing(function(app) { app.modules('myCommentPlugin'); });
  • 插件用户是否有理由不修改他们的应用程序以自行注入模块? ocLazyLoad 很好,但仅供应用所有者使用,而不是入侵他人的应用。
  • @estus,让插件用户添加它并不是世界末日。但它是一个 Umbraco 插件,它有一个 Umbraco 宏,它会自动将它包含在页面上,所以理想情况下,只要它们在页面上有角度,我希望它能够自动工作。甚至让它注入它自己的脚本标签或需要自己加载。

标签: angularjs


【解决方案1】:

这可以通过使用未记录的requires 模块属性来完成。这样new dependencies can be added 在模块定义之后但在它被引导之前。

由于 'ng' 是唯一已知且已定义的模块 ATM(它也已经定义了requires 数组),因此对其进行篡改:

angular.module('ng').requires.push('theCommentSystemModule');

虽然让用户自己加载模块更合适。

【讨论】:

  • 如果是这样的话,我假设如果我们使用ng-app我们将无法使用这种方法。假设正确吗?
  • @user1776573 不是真的。要被 ng-app bootstrapping 接受,脚本应该在 document 'ready' event fires 之前执行。相同的限制适用于常规应用程序脚本。
猜你喜欢
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2017-05-12
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
相关资源
最近更新 更多