当前位置: 首页 > 面试题库 >

用RequireJS延迟加载AngularJS模块

华鹭洋
2023-03-14
问题内容

感谢Dan Wahlin的精彩文章,我设法实现了Angular的控制器和服务的延迟加载。但是,似乎没有一种干净的方法来懒惰加载独立的模块。

为了更好地解释我的问题,假设我有一个没有RequireJS的应用,其结构如下:

// Create independent module 'dataServices' module with 'Pictures' object
angular.module("dataServices", []).factory("Pictures", function (...) {...});

// Create 'webapp' ng-app, with dependency to 'dataServices', defining controllers
angular.module("webapp", ['dataServices'])
.controller("View1Controller", function (...) {...})
.controller("View2Controller", function (...) {...});

这是在Plunker中带有RequireJS的示例应用程序:http
://plnkr.co/aiarzVpMJchYPjFRrkwn


问题的核心是Angular不允许ng- app在实例化后添加依赖。结果,我的解决方案是使用angular.injector检索Picture要在my中使用的对象的实例View2Controller。查看js/scripts/controllers/ctrl2.js文件。

这给我带来了两个问题:

  1. 注入的服务在angular之外运行,因此所有异步调用都必须以$ scope。$ apply()结尾
  2. 杂乱的代码,其中某些对象可以使用标准角度语法进行注入,而其他对象则需要明确使用注入器。

你们中有没有人知道如何使用RequireJS来延迟加载独立模块,并以某种方式将其挂在angular上,以便可以使用正常的角度依赖注入语法?

注意
问题在于 独立模块的 延迟加载。此特定示例的一种简单解决方案是在期间使用缓存的$ providers创建“图片”对象,ng- app.config但这不是我想要的。我正在寻找可与第三方模块配合使用的解决方案angular-resource


问题答案:

看看我在GitHub上的项目:angular-require-lazy

该项目旨在展示一个想法并激发讨论。但是, 正是您想要的(请检查Expenses-
view.js
,它会延迟加载ng-
grid)。

我对评论,想法等非常感兴趣。

(编辑)ng-grid Angular模块的延迟加载如下:

  1. expenses-view.js``/expenses激活路线后,会延迟加载
  2. expenses-view.js 将ng-grid指定为依赖项,因此RequireJs首先加载ng-grid
  3. ng-grid是调用 angular.module(...)

为了做到这一点,我 angular.module支持懒惰的我自己的方法 替换了
(实际上是代理)真实的方法。请参阅bootstrap.js和route-
config.js(功能initLazyModules()callRunBlocks())。

此实现有其缺点,您应该意识到:

  1. 尚未实现配置功能。我不知道是否有可能 懒惰地 提供 配置时间 依赖性。
  2. 顺序在定义中很重要。如果服务A依赖于B,但在模块中B之后定义了A,则DI将失败。这是因为lazyAngular代理会立即执行定义,这与真正的Angular不同,真正的Angular确保在执行定义之前先解决依赖关系。


 类似资料:
  • 为了显示这种关系,让我们开始定义一个简单的模块,作为我们的示例应用程序的根模块。 app/app.module.ts 到目前为止,这是一个非常常见的模块,依赖于,有一个路由机制和两个组件:AppComponent和EagerComponent。 现在,让我们专注于定义导航的应用程序(AppComponent)的根组件。 app/app.component.ts import { Component

  • 本文向大家介绍Webpack 实现 AngularJS 的延迟加载,包括了Webpack 实现 AngularJS 的延迟加载的使用技巧和注意事项,需要的朋友参考一下 随着你的单页应用扩大,其下载时间也越来越长。这对提高用户体验不会有好处(提示:但用户体验正是我们开发单页应用的原因)。更多的代码意味着更大的文件,直到代码压缩已经不能满足你的需求,你唯一能为你的用户做的就是不要再让他一次性下载整个应

  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l

  • 本文向大家介绍AngularJS使用ocLazyLoad实现js延迟加载,包括了AngularJS使用ocLazyLoad实现js延迟加载的使用技巧和注意事项,需要的朋友参考一下 最近开发一个系统遇到了一个问题,用angular路由一个html片段,该片段需要使用一个js插件来实现一个富文本编辑器。关键问题在于必须要在片段加载后通过js与dom元素进行绑定。一开始想当然以为直接把js代码写在代码段

  • 本文向大家介绍AngularJS中的Directive实现延迟加载,包括了AngularJS中的Directive实现延迟加载的使用技巧和注意事项,需要的朋友参考一下 所谓的延迟加载通常是:直到用户交互时才加载。如何实现延迟加载呢? 需要搞清楚三个方面: 1、html元素的哪个属性需要延迟加载? 2、需要对数据源的哪个字段进行延迟加载? 3、通过什么事件来触发延迟加载? 自定义的Directive

  • 我试图实现延迟加载,但得到如下错误** 错误错误:未捕获(在promise中):错误:BrowserModule已加载。如果您需要从一个延迟加载的模块中访问一些公共指令,比如NgIf和NgFor,那么可以导入CommonModule。 ** 需要帮助这是我的模块 共享模块 2.设置模块 5.AppModule