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;
按需载入
首先我们要了解一下几点:
- 什么时机下载入:
在 ngRoute 和 uiRoute 中都提供了 resolve 属性里的值会在路由成功前被预先设定好,然后注入到控制器中。通俗地将。就是等数据都“就位”后。才进行路由(事实上我认为也不能叫路由。因为路由是一些列的操作。当中就包含了设置 resolve 属性等等)。能够參考我的上篇文章。
- 载入后的文件怎样注冊:
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 = "--測试 ";
});
});
AngulerJS学习(五)按需动态载入文件的更多相关文章
- Extjs学习----------动态载入js文件(减轻浏览器的压力)
动态载入js文件能够减轻浏览器的压力,本例使用了Ext.window.Window组件,该组件的学习地址:http://blog.csdn.net/z1137730824/article/detail ...
- JavaScript学习10:动态载入脚本和样式
我们在写Web页面的时候,须要引入非常多的JavaScript脚本文件和CSS样式文件,尤其是在站点需求量非常大的时候,脚本的需求量也随之变大,这样一来,站点的性能就会大打折扣.因此就出现了动态载入的 ...
- 风炫安全web安全学习第三十五节课 文件下载和文件读取漏洞
风炫安全web安全学习第三十五节课 文件下载和文件读取漏洞 0x03 任意文件下载漏洞 一些网站由于业务需求,往往需要提供文件下载功能,但若对用户下载的文件不做限制,则恶意用户就能够下载任意敏感文件, ...
- 为了提高性能,怎样动态载入JS文件
超级表格是一款多人协作的在线表格.程序相当复杂,用到十几个JS文件. 可是有些文件是在打开某些类型的表格时才须要载入. 比如,仅仅有当打开甘特图表格时,才须要载入gantetu.js文件. 那么问题来 ...
- 详谈LABJS按需动态加载js文件
为了提高页面的打开和加载速度,我们经常把JS文件放在页面的尾部,但是有些JS必须放在页面前面,这样就会增加页面的加载时间:于是出现了按需动态加载的概念,这个概念就是当页面需要用到这个JS文件或者CSS ...
- 利用Loader来动态载入不同的QML文件来改变UI
在这篇文章中.我们将介绍怎样使用Loader来载入不同的QML文件来实现动态的UI.在之前的文章"怎样使用Loader来动态载入一个基于item的Component"中,我们已经介 ...
- cocos2dx3.2 异步载入和动态载入
半个月没有更新博客,从这个项目開始学习了非常多细节的东西,都不太成系统.可是却是开发上线中必须经历的东西.比方超级玛丽系列(一)中的正确的异步载入,正确的分层.正确的合成和载入plist.及时的移除未 ...
- (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射
http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...
- 恶意代码分析实战五:OllyDebug动态结合
目录 恶意代码分析实战五:OllyDebug动态结合 OllyDebug界面介绍 OllyDebug载入程序方法 OllyDebug地址跳转 OllyDebug下断点 OllyDebug单步执行 Ol ...
随机推荐
- Codeforces Round #394 (Div. 2) B. Dasha and friends 暴力
B. Dasha and friends 题目连接: http://codeforces.com/contest/761/problem/B Description Running with barr ...
- hdu 5734 Acperience 水题
Acperience 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5734 Description Deep neural networks (DN ...
- 巧用CSS3 :target 伪类制作Dropdown下拉菜单(无JS)
:target 是CSS3 中新增的一个伪类,用以匹配当前页面的URI中某个标志符的目标元素(比如说当前页面URL下添加#comment就会定位到id=“comment”的位置,俗称锚).CSS3 为 ...
- TimingTool - The Timing Diagram Editor
TimingTool - The Timing Diagram TimingTool is designed to give electronics engineers an easy to use ...
- Mysql数据库大表归档操作
由于公司的某个系统数据表过亿,考虑到数据表的压力.所以根据某个时间点对数据表做了一个归档.以下的操作是在当前的数据库新建表用于存储历史数据,然后再对生产表做一个清理操作.如果有条件的话可以把归档的数据 ...
- Cygwin、MinGw、mingw-w64,MSys msys2区别与联系
https://www.biaodianfu.com/cygwin-ming-msys.html http://www.mingw-w64.org/doku.php http://blog.csdn. ...
- 少女花海自拍撞亡:自拍PK火车速度,没有赢家
心理学研究,自拍是一种自我强化的过程.人们都或多或少有着自我关注的倾向,即“自恋”.而人作为有思想的群体性社会动物,有着分享和交流的欲望.尤其是现代快节奏的生活常使人感觉“亚历山大”,自拍恰恰就成为释 ...
- 这里包含几乎所有的xcode正式版本
https://developer.apple.com/downloads/
- 解决ubuntu上在androidstudio中启动emulator闪退的问题(1)
作者 彭东林 pengdonglin137@163.com 平台 Ubuntu14.04 64 androidstudio 2.3.3 现象 在创建好模拟器后,点击启动时,模拟器界面刚出来就闪退了 解 ...
- Java String练习题及答案
1. 编写程序将 “jdk” 全部变为大写,并输出到屏幕,截取子串”DK” 并输出到屏幕 /** * 编写程序将 “jdk” 全部变为大写,并输出到屏幕,截取子串”DK” 并输出到屏幕 */ publ ...