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 相关文章推荐
JavaScript 加号(+)运算符号
Dec 06 Javascript
Javascript 自定义类型方法小结
Mar 02 Javascript
jQuery中实现动画效果的基本操作介绍
Apr 16 Javascript
JSONP跨域的原理解析及其实现介绍
Mar 22 Javascript
Jquery实现Div上下移动示例
Apr 23 Javascript
JavaScript学习笔记之JS函数
Jan 22 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
May 28 Javascript
javascript中mouseenter与mouseover的异同
Jun 06 Javascript
Express结合Webpack的全栈自动刷新
May 23 Javascript
express + jwt + postMan验证实现持久化登录
Jun 05 Javascript
vuex 动态注册方法 registerModule的实现
Jul 03 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
Aug 29 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
老照片 - 几十年前的收音机与人
2021/03/02 无线电
法压式咖啡之制作法
2021/03/03 冲泡冲煮
PHP 图片文件上传实现代码
2010/12/29 PHP
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
JavaScript的类型转换(字符转数字 数字转字符)
2010/08/30 Javascript
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
javascript获取URL参数与参数值的示例代码
2013/12/20 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
JavaScript中奇葩的假值示例应用
2014/03/11 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
第六篇Bootstrap表格样式介绍
2016/06/21 Javascript
浅谈Node.js爬虫之网页请求模块
2018/01/11 Javascript
深入理解 ES6中的 Reflect用法
2020/07/18 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
你眼中的Python大牛 应该都有这份书单
2017/10/31 Python
python多进程实现进程间通信实例
2017/11/24 Python
python web基础之加载静态文件实例
2018/03/20 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
django rest framework 过滤时间操作
2020/07/12 Python
Python操作Elasticsearch处理timeout超时
2020/07/17 Python
高中毕业自我鉴定
2013/12/19 职场文书
尽职尽责村干部自我鉴定
2014/01/23 职场文书
体育活动总结范文
2014/05/04 职场文书
六年级小学生评语
2014/12/26 职场文书
小学四年级学生评语
2014/12/26 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
2019事业单位个人工作总结范文
2019/08/26 职场文书
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android