AngulerJS学习之按需动态加载文件


Posted in Javascript onFebruary 13, 2017

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

$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 = "--测试 ";
  });
});

源码:requireLearn_3water.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
Jan 11 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
Oct 11 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
May 30 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
Feb 11 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
Mar 03 Javascript
jquery实现兼容IE8的异步上传文件
Jun 15 Javascript
js实现C#的StringBuilder效果完整实例
Dec 22 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
Sep 14 Javascript
浅谈js的异步执行
Oct 18 Javascript
如何获取TypeScript的声明文件.d.ts
May 01 Javascript
WebStorm中如何将自己的代码上传到github示例详解
Oct 28 Javascript
详解如何解决使用JSON.stringify时遇到的循环引用问题
Mar 23 Javascript
JavaScript获取ul中li个数的方法
Feb 13 #Javascript
JavaScript中数组的各种操作的总结(必看篇)
Feb 13 #Javascript
JS实现选定指定HTML元素对象中指定文本内容功能示例
Feb 13 #Javascript
利用js判断手机是否安装某个app的多种方案
Feb 13 #Javascript
详谈js中window.location.search的用法和作用
Feb 13 #Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
Feb 13 #Javascript
js获取当前页的URL与window.location.href简单方法
Feb 13 #Javascript
You might like
大师制作的中短波矿石收音机
2020/04/02 无线电
php将文本文件转换csv输出的方法
2014/12/31 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
SWFObject Flash js调用类
2008/07/08 Javascript
实例详解AngularJS实现无限级联动菜单
2016/01/15 Javascript
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
jQuery实现发送验证码并60秒倒计时功能
2016/11/25 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
JavaScript实现移动端页面按手机屏幕分辨率自动缩放的最强代码
2017/08/18 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
2019/05/10 jQuery
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
[43:41]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
python登陆asp网站页面的实现代码
2015/01/14 Python
python实现给数组按片赋值的方法
2015/07/28 Python
python 实现自动远程登陆scp文件实例代码
2017/03/13 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
Python3离线安装Requests模块问题
2019/10/13 Python
python中threading开启关闭线程操作
2020/05/02 Python
简述python&pytorch 随机种子的实现
2020/10/07 Python
本科生详细的自我评价
2013/09/19 职场文书
交通事故赔偿协议书
2014/04/15 职场文书
书香校园建设方案
2014/05/02 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
2015暑假假期总结
2015/07/13 职场文书
python入门之算法学习
2021/04/22 Python
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis