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选择器源码解读(八):addCombinator函数
Mar 31 Javascript
jQuery实现类似老虎机滚动抽奖效果
Aug 06 Javascript
JavaScript的Backbone.js框架入门学习指引
May 07 Javascript
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
Mar 23 jQuery
使用JavaScript实现链表的数据结构的代码
Aug 02 Javascript
浅析Javascript中双等号(==)隐性转换机制
Oct 27 Javascript
Vue引入jquery实现平滑滚动到指定位置
May 09 jQuery
使用svg实现动态时钟效果
Jul 17 Javascript
IE8中jQuery.load()加载页面不显示的原因
Nov 15 jQuery
js中null与空字符串""的区别讲解
Jan 17 Javascript
vue 获取视频时长的实例代码
Aug 20 Javascript
微信jssdk踩坑之签名错误invalid signature
May 19 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
编写自己的php扩展函数
2006/10/09 PHP
CodeIgniter框架中_remap()使用方法2例
2014/03/10 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
javascript Select标记中options操作方法集合
2008/10/22 Javascript
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
Boostrap入门准备之border box
2016/05/09 Javascript
jquery对所有input type=text的控件赋值实现方法
2016/12/02 Javascript
vue-cli3搭建项目的详细步骤
2018/12/05 Javascript
js实现自动播放匀速轮播图
2020/02/06 Javascript
[01:04]不如跳舞!DOTA2新英雄玛尔斯的欢乐日常
2019/03/11 DOTA
python删除列表中重复记录的方法
2015/04/28 Python
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
Python执行时间的计算方法小结
2017/03/17 Python
解读! Python在人工智能中的作用
2017/11/14 Python
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
python 利用pyttsx3文字转语音过程详解
2019/09/25 Python
python 串口读取+存储+输出处理实例
2019/12/26 Python
python用700行代码实现http客户端
2021/01/14 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
Viking比利时:购买办公用品
2019/10/30 全球购物
孝老爱亲模范事迹
2014/01/24 职场文书
技校个人求职信范文
2014/01/25 职场文书
优秀民警事迹材料
2014/01/29 职场文书
《草虫的村落》教学反思
2014/02/16 职场文书
2015年征兵工作总结
2015/07/23 职场文书
遗嘱格式范本
2015/08/07 职场文书
食品安全主题班会
2015/08/13 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
写作之关于描写老人的好段摘抄
2019/11/14 职场文书
python使用pywinauto驱动微信客户端实现公众号爬虫
2021/05/19 Python