在此之前我么年首先要先了解几个东西:

$q

简单介绍:

$q:主要解决的是异步编程的问题,是指描写叙述通过一个承诺行为与对象代表的异步运行的行动结果的交互。可能会也可能不会再不论什么时候完毕。

我们通过一个小故事理解 $q 服务。

  1. 中午点外买,打电话要了份炒饭,要求送到公司并给了老板详细地址。这个过程就是 $q.defer。
  2. 饭菜不可能马上送到,因此这是一个延期响应的请求;
  3. 老板说尽快送到。也就是老板给了我一个承诺 promise;
  4. 我能够边工作边等待,说明这个请求是个异步运行的过程。
  5. 这样这个延期异步请求就算建立完毕了。就是一个deferred。
  6. 饭菜送到我去接受,这个过程称为 deferred.resolve(data) 响应事件。
  7. 假设米饭卖完了老板会告诉我做不了了。也就是拒绝我的请求了,就是 deferred.reject(error);
  8. 老板能够再不论什么时候跟我说做不了。仅仅要在他还没把饭送来之前都能够。
  9. 快到楼下了,通知我去取。这就是通知 deferred.notify(data)

    这样整个异步回调过程就完毕了。
  10. 第二天我们好多人都要订餐。所以我就能够发起 $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 = "--測试 ";
});
});

源代码:https://github.com/ZangYuSong/requireLearn

AngulerJS学习(五)按需动态载入文件的更多相关文章

  1. Extjs学习----------动态载入js文件(减轻浏览器的压力)

    动态载入js文件能够减轻浏览器的压力,本例使用了Ext.window.Window组件,该组件的学习地址:http://blog.csdn.net/z1137730824/article/detail ...

  2. JavaScript学习10:动态载入脚本和样式

    我们在写Web页面的时候,须要引入非常多的JavaScript脚本文件和CSS样式文件,尤其是在站点需求量非常大的时候,脚本的需求量也随之变大,这样一来,站点的性能就会大打折扣.因此就出现了动态载入的 ...

  3. 风炫安全web安全学习第三十五节课 文件下载和文件读取漏洞

    风炫安全web安全学习第三十五节课 文件下载和文件读取漏洞 0x03 任意文件下载漏洞 一些网站由于业务需求,往往需要提供文件下载功能,但若对用户下载的文件不做限制,则恶意用户就能够下载任意敏感文件, ...

  4. 为了提高性能,怎样动态载入JS文件

    超级表格是一款多人协作的在线表格.程序相当复杂,用到十几个JS文件. 可是有些文件是在打开某些类型的表格时才须要载入. 比如,仅仅有当打开甘特图表格时,才须要载入gantetu.js文件. 那么问题来 ...

  5. 详谈LABJS按需动态加载js文件

    为了提高页面的打开和加载速度,我们经常把JS文件放在页面的尾部,但是有些JS必须放在页面前面,这样就会增加页面的加载时间:于是出现了按需动态加载的概念,这个概念就是当页面需要用到这个JS文件或者CSS ...

  6. 利用Loader来动态载入不同的QML文件来改变UI

    在这篇文章中.我们将介绍怎样使用Loader来载入不同的QML文件来实现动态的UI.在之前的文章"怎样使用Loader来动态载入一个基于item的Component"中,我们已经介 ...

  7. cocos2dx3.2 异步载入和动态载入

    半个月没有更新博客,从这个项目開始学习了非常多细节的东西,都不太成系统.可是却是开发上线中必须经历的东西.比方超级玛丽系列(一)中的正确的异步载入,正确的分层.正确的合成和载入plist.及时的移除未 ...

  8. (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...

  9. 恶意代码分析实战五:OllyDebug动态结合

    目录 恶意代码分析实战五:OllyDebug动态结合 OllyDebug界面介绍 OllyDebug载入程序方法 OllyDebug地址跳转 OllyDebug下断点 OllyDebug单步执行 Ol ...

随机推荐

  1. hdu CA Loves GCD(dp)

    一道我想骂人的题,差点把我气炸了. 题意: 求一个数的集合中(非多重集,每个数只出现一次)所有子集的gcd的和.结果MOD10^8+7输出. 输入输出不说了,自己看吧,不想写了. 当时我真把它当作数论 ...

  2. tomcat配置问题:访问http://localhost:8080/ 遇到 Access Error: 404

    win7: 8080端口已经被其他应用使用,比如nixxxxxxxxxxxxx When I had an error Access Error: 404 -- Not Found I fixed i ...

  3. rails 数据迁移 -migration

    1.创建一个fruits 项目: rails new fruits -d mysql --skip-bundle 2.修改Gemfile: source 'https://gems.ruby-chin ...

  4. spring cloud 学习(11) - 用fastson替换jackson及用gb2312码输出

    前几天遇到一个需求,因为要兼容旧项目的编码格式,需要spring-cloud的rest接口,输出gb2312编码,本以为是一个很容易的事情,比如下面这样: @RequestMapping(method ...

  5. STM32 GPIO 配置之ODR, BSRR, BRR 详解

    STM32 GPIO 配置之ODR, BSRR, BRR 详解 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能 ...

  6. 零宽断言 -- Lookahead/Lookahead Positive/Negative

    http://www.vaikan.com/regular-expression-to-match-string-not-containing-a-word/ 经常我们会遇到想找出不包含某个字符串的文 ...

  7. SimpleUpdater.NET

    本类库+工具用于快速实现一个简单的自动更新程序,旨在快速简单地为现有的.Net应用程序添加上比较简单的自动更新功能. 本页包含以下内容 概述 整个自动升级工作的流程 更新包生成工具 发布更新包 为应用 ...

  8. JavaScript进阶系列01,函数的声明,函数参数,函数闭包

    本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调 ...

  9. AOP拦截器 表达式写法

    Pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的.Pointcut可以有下列方式来定义或者通过& ...

  10. “finally block does not complete normally”的警告解决

    但是,java里面不是可以保证finally一定会执行的么,为什么不可以在finally块做return??? 细细看道来: debug一下这个函数,就会惊讶的发现, 里面抛出的异常会被finally ...