AngulerJS学习之按需动态加载文件
在此之前我们首先要先了解几个东西:
$q
简介:
$q:主要解决的是异步编程的问题,是指描述通过一个承诺行为与对象代表的异步执行的行动结果的交互,可能会也可能不会再任何时候完成。
我们通过一个小故事理解 $q 服务。
- 中午点外买,打电话要了份炒饭,要求送到公司并给了老板具体地址。这个过程就是 $q.defer;
- 饭菜不可能立即送到,因此这是一个延期响应的请求;
- 老板说尽快送到。也就是老板给了我一个承诺 promise;
- 我可以边工作边等待,说明这个请求是个异步执行的过程。
- 这样这个延期异步请求就算建立完成了。就是一个deferred。
- 饭菜送到我去接受,这个过程称为 deferred.resolve(data) 响应事件;
- 如果米饭卖完了老板会告诉我做不了了,也就是拒绝我的请求了,就是 deferred.reject(error);
- 老板可以再任何时候跟我说做不了,只要在他还没把饭送来之前都可以。
- 快到楼下了,通知我去取。这就是通知 deferred.notify(data) 这样整个异步回调过程就完成了。
- 第二天我们好多人都要订餐。所以我就可以发起 $q.all(req1,req2,req3.);
使用
我们在服务中这样定义,在请求开始之间建立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 = "--测试 ";
});
});
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
详解为Angular.js内置$http服务添加拦截器的方法
所谓拦截器就是在目标达到目的地之前对其进行处理以便处理结果更加符合我们的预期。Angular的$http拦截器是通过$httpProvider.interceptors数组定义的一组拦截器,每个拦截器都是实现了某些特定方法的Factory。本文就介绍了为Angular.js内置$http服务添加拦截器的方法。2016-12-12
如何在Angular8.0下使用ngx-translate进行国际化配置
这篇文章主要介绍了如何在Angular8.0下使用ngx-translate进行国际化配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-07-07
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
这篇文章主要介绍了AngularJS与服务器Ajax交互操作的方法,可实现post传输数据的功能,并附带完整的demo源码供读者下载参考,源码中还包含了前面章节的示例文件,需要的朋友可以参考下2016-11-11
Angular2-primeNG文件上传模块FileUpload使用详解
这篇文章主要为大家详细介绍了Angular2-primeNG文件上传模块FileUpload使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-01-01


最新评论