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 页面坐标相关知识整理
Jan 09 Javascript
JavaScript 原型链学习总结
Oct 29 Javascript
jQuery 插件开发指南
Nov 14 Javascript
bootstrap-treeview自定义双击事件实现方法
Jan 09 Javascript
30分钟快速掌握Bootstrap框架
May 24 Javascript
JavaScript 数据类型详解
Mar 13 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
Apr 16 Javascript
javascript 封装Date日期类实例详解
May 28 Javascript
Bootstrap Table使用整理(五)之分页组合查询
Jun 09 Javascript
jQuery序列化后的表单值转换成Json
Jun 16 jQuery
Vuerouter的beforeEach与afterEach钩子函数的区别
Dec 26 Javascript
详解Vue router路由
Nov 20 Vue.js
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
php jsonp单引号转义
2014/11/23 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
ThinkPHP5 验证器的具体使用
2018/05/31 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
js确认删除对话框适用于a标签及submit
2014/07/10 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
基于jQuery实现音乐播放试听列表
2016/04/14 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
vue+moment实现倒计时效果
2019/08/26 Javascript
Vue路由切换页面不更新问题解决方案
2020/07/10 Javascript
在antd Table中插入可编辑的单元格实例
2020/10/28 Javascript
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
Python操作MySQL简单实现方法
2015/01/26 Python
python实现简单的文字识别
2018/11/27 Python
Python将字符串常量转化为变量方法总结
2019/03/17 Python
对python tkinter窗口弹出置顶的方法详解
2019/06/14 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
浅谈PyTorch中in-place operation的含义
2020/06/27 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
2021/01/23 Python
Pytorch之扩充tensor的操作
2021/03/04 Python
HTML5中使用postMessage实现Ajax跨域请求的方法
2016/04/19 HTML / CSS
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
应届生服务员求职信
2013/10/31 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
2019年中,最受大众欢迎的6本新书
2019/08/07 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
导游词之云南丽江古城
2019/09/17 职场文书
Python IO文件管理的具体使用
2022/03/20 Python
JS前端轻量fabric.js系列物体基类
2022/08/05 Javascript