【问题标题】:How to unload angularjs modules [closed]如何卸载angularjs模块[关闭]
【发布时间】:2014-04-11 06:41:39
【问题描述】:

我有一个包含 N 个模块的应用程序。几乎所有这些模块都将按需加载。

有没有什么好的方法可以用动态加载和卸载的模块来组织 AngularJS 应用程序?

为什么我们需要卸载模块

  • 模块数 (N) 可以尽可能多,我不能保证它们的最大数量。所以我尽量避免过度使用内存;
  • 我不认为将代码留在我们不会使用的浏览器中是最佳做法(我不喜欢我的 web 应用程序的选项卡会消耗所有可用内存并挂起浏览器的想法);
  • 我认为谷歌也是如此。您可以整天使用 Gmail,而且它仍然可以正常运行(Google I/O 2013 - 使用 Gmail 和 DevTools 的记忆之旅http://www.youtube.com/watch?v=x9Jlu_h_Lyw)。

已链接

【问题讨论】:

  • 在this 示例应用程序中,我正在尝试按需动态加载Angular 视图和Angular 模块。虽然我对它并不完全满意,但它确实有效。不知道如何卸载模块,抱歉。
  • 尤金,你找到解决办法了吗?我完全同意你的观点,如果我们不能在S P A 中卸载模块,那么我们一定会严重怀疑角度优势!
  • 我已经表达了我对这个问题的理解stackoverflow.com/questions/27467908/…

标签: javascript angularjs architecture module


【解决方案1】:

从 Angular 1.2.16 和 1.3.0 beta 开始,bootstrap() 方法 defines a specific element on the DOM as the root scope for a collection of modules。没有对应的解绑方法。 ng-app 指令是 just a shortcut for bootstrap(),所以同样的限制也适用。

链接到的 angular-requirejs-seed 项目 Artemis 无法回答您的问题。它在页面加载时使用NG_DEFER_BOOTSTRAP! 属性到suspend the bootstrap process and dynamically define which modules to add。它不会卸载任何东西。

克服 Angular 固有的无法卸载模块的最直接方法是销毁运行模块的 DOM 元素。不幸的是,通过销毁元素,您也会丢失所有标记。该问题的一种解决方案是将应用程序的标记放入 HTML5 <template> 元素并克隆其内容。这是an example I wrote in JSBin,其中一个含糊不清的someGuyInASuit 指令根据加载的模块加载了 Jekyll 博士或 Hyde 先生的图片。

这种解决方法不太适合由许多模块组成的应用程序,尤其是当您打算在用户与其交互时频繁地交换它们时。一方面,您的所有模型都将被销毁。此外,所有config() 和run() 块都将重新运行。你可能想要 fork Angular 并添加你自己的 un-bootstrap 方法,或者看看另一个框架,比如 React,它内置了 a method for unloading components。

【讨论】:

    【解决方案2】:

    也许你会发现这篇文章很有帮助。 http://rarabaolaza.tumblr.com/post/56707155391/a-plugin-based-architecture-for-angularjs-apps

    它描述了使用 requirejs 和一些元数据来创建基于插件的 Angular 应用程序的近似方法,其中每个插件都是一个模块,也许您可​​以根据自己的需要调整它或获得一些想法。但恐怕没有模块卸载。

    如果您认为这可以帮助您,我目前正在修改它并(我相信)改进这些想法,所以请随时询问

    HTH

    【讨论】:

    • 是的,我也打算用RequireJS这样来扩展Angular的模块我觉得更适合我的另一个问题:stackoverflow.com/questions/18891169/…但是是的,关于卸载模块的问题还是实际的。因此,如果您要找到一些东西,我想听听。谢谢:)
    【解决方案3】:

    看看这个项目。您可以将 Angular 与 RequireJs 一起使用 https://github.com/tnajdek/angular-requirejs-seed

    关于您的项目,我不会关心大量的 Angular 模块,它们只是一个轻量级对象,可让您将代码拆分为逻辑部分。 如果您遇到一些内存问题,请考虑进行一些代码重构以摆脱性能杀手。

    【讨论】:

    • 如果您需要潜在地动态加载数十个模块,每个模块都有自己的一组服务、控制器、指令等,会发生什么?根据模块的组件,它可能不会那么轻量级。
    猜你喜欢
    • 2011-05-16
    • 2012-03-06
    • 1970-01-01
    • 2013-11-17
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多