在此之前我们首先要先了解几个东西:
$q
简介:
$q:主要解决的是异步编程的问题,是指描述通过一个承诺行为与对象代表的异步执行的行动结果的交互,可能会也可能不会再任何时候完成。
我们通过一个小故事理解 $q 服务。
使用
我们在服务中这样定义,在请求开始之间建立deferred,然后return deferred.promise.在获取到数据的时候deferred.resolve(data)。同样我们在中间可以收到通知或者拒绝等。
var def = $q.defer(); def.resolve(data); return def.promise;
按需加载
首先我们要了解一下几点:
1、什么时机下加载:
在 ngRoute 和 uiRoute 中都提供了 resolve 属性里的值会在路由成功前被预先设定好,然后注入到控制器中。通俗地将,就是等数据都“就位”后,才进行路由(其实我觉得也不能叫路由,因为路由是一些列的操作,其中就包括了设置 resolve 属性等等)。可以参考我的上篇文章。
2、加载后的文件如何注册:
angular有个启动函数,叫做bootstrap。 根据angular的代码设计,你需要在启动之前定义所有的controller。就好似有个袋子,你在bootstrap之前想往里塞什么就塞什么。可是一旦bootstrap了,他就不再接受你任何往里塞的controller了。
解决这个问题,只有一个方法,就是利用主模块的provider主动注册controller。但是由于provider不能直接使用,所以我们把它存在主模块下面。通过存下来的方法,可以用来注册异步加载回来的页面组件。
通过上述我们知道了需要异步加载文件
实现
// controller define(["app"], function(app) { app.config(["$stateProvider", "$urlRouterProvider", "$controllerProvider", function($stateProvider, $urlRouterProvider, $controllerProvider) { // angular有个启动函数,叫做bootstrap; // 根据angular的代码设计,你需要在启动之前定义所有的controller; // 就好似有个袋子,你在bootstrap之前想往里塞什么就塞什么; // 可是一旦bootstrap了,他就不再接受你任何往里塞的controller了; // 解决这个问题,只有一个方法,就是利用主模块的provider主动注册controller; // 但是由于provider不能直接使用,所以我们把它存在主模块下面; // 通过存下来的方法,可以用来注册异步加载回来的页面组件。 app.registerController = $controllerProvider.register; app.loadFile = function(js) { return function($rootScope, $q) { //通过$q服务注册一个延迟对象 deferred var def = $q.defer(), deps = []; angular.isArray(js) ? (deps = js) : deps.push(js); require(deps, function() { $rootScope.$apply(function() { // 成功 def.resolve(); // def.reject() 不成功 // def.notify() 更新状态 }); }); //通过deferred延迟对象,可以得到一个承诺promise,而promise会返回当前任务的完成结果 return def.promise; }; } $urlRouterProvider.otherwise('/index'); $stateProvider.state("index", { url: "/index", template: "这是首页页面" }); $stateProvider.state("computers", { url: "/computers", template: "这是电脑分类页面{{title}}", controller: "ctrl.file", resolve: { loadFile: app.loadFile("file") } }); $stateProvider.state("printers", { url: "/printers", template: "这是打印机页面" }); $stateProvider.state("blabla", { url: "/blabla", template: "其他" }); } ]); });
// file.js define(["app"], function(app) { app.registerController("ctrl.file", function($scope) { $scope.title = "--测试 "; }); });
源码:requireLearn_jb51.rar
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
问题内容: 好的,我已经搜索了高低位,但是无法可靠地确定Webpack是否可行。 https://github.com/webpack/webpack/tree/master/examples/require.context 似乎表明可以将字符串传递给函数并加载模块… 但是我的尝试没有用:webpack.config.js server.js modules /模块中名为test.js的模块 但是
出于性能的考虑,我们会对模块和组件进行按需加载。 按需加载组件 通过 umi/dynamic 接口实现,比如: import dynamic from 'umi/dynamic'; const delay = (timeout) => new Promise(resolve => setTimeout(resolve, timeout)); const App = dynamic({ loa
本文向大家介绍webpack学习笔记之代码分割和按需加载的实例详解,包括了webpack学习笔记之代码分割和按需加载的实例详解的使用技巧和注意事项,需要的朋友参考一下 本文介绍了webpack学习笔记之代码分割和按需加载的实例详解,分享给大家,也给自己留个笔记 为什么需要代码分割和按需加载 代码分割就是我们根据实际业务需求将代码进行分割,然后在合适的时候在将其加载进入文档中。 举个简单的例子: 1
本文向大家介绍学习javascript文件加载优化,包括了学习javascript文件加载优化的使用技巧和注意事项,需要的朋友参考一下 在js引擎部分,我们可以了解到,当渲染引擎解析到script标签时,会将控制权给JS引擎,如果script加载的是外部资源,则需要等待下载完后才能执行。 所以,在这里,我们可以对其进行很多优化工作。 放置在BODY底部 为了让渲染引擎能够及早的将DOM树给渲染出来
问题内容: 如何可靠,动态地加载JavaScript文件?这将用于实现模块或组件,该模块或组件在“初始化”时将根据需要动态加载所有需要的JavaScript库脚本。 使用该组件的客户端不需要加载实现该组件的所有库脚本文件(并将标记手动插入其网页),只需加载“主”组件脚本文件即可。 主流JavaScript库如何做到这一点(原型,jQuery等)? 这些工具是否将多个JavaScript文件合并到脚
本文向大家介绍requirejs按需加载angularjs文件实例,包括了requirejs按需加载angularjs文件实例的使用技巧和注意事项,需要的朋友参考一下 之前分享了一篇用ocLazyLoad实现按需加载angular js文件的博客.本来当时想会使用一种方法就行了.可最近刚好有时间,在网上查找了一下requirejs实现angular js文件按需加载的资料.方案如下: 项目的主结构