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 相关文章推荐
一个很酷的拖动层的js类,兼容IE及Firefox
Jun 23 Javascript
十个迅速提升JQuery性能让你的JQuery跑得更快
Dec 10 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
Mar 12 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
Mar 18 Javascript
js实现右下角提示框的方法
Feb 03 Javascript
微信小程序 传值取值的几种方法总结
Jan 16 Javascript
从零学习node.js之详解异步控制工具async(八)
Feb 27 Javascript
Node.js数据库操作之连接MySQL数据库(一)
Mar 04 Javascript
AngularJS集合数据遍历显示的实例
Dec 27 Javascript
JavaScript中arguments和this对象用法分析
Aug 08 Javascript
JS在Array数组中按指定位置删除或添加元素对象方法示例
Nov 19 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
Jan 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
ASP知识讲座四
2006/10/09 PHP
php横向重复区域显示二法
2008/09/25 PHP
php截取utf-8中文字符串乱码的解决方法
2010/03/29 PHP
深入PHP变量存储的详解
2013/06/13 PHP
php将图片保存入mysql数据库失败的解决方法
2014/12/27 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
2012/10/15 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
JS实现将人民币金额转换为大写的示例代码
2014/02/13 Javascript
jquery 使用简明教程
2014/03/05 Javascript
编写自己的jQuery提示框(Tip)插件
2015/02/05 Javascript
jQuery 局部div刷新和全局刷新方法总结
2016/10/05 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
通过实例解析JavaScript for in及for of区别
2020/06/15 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
微信小程序实现星星评分效果
2020/11/01 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
Python实现在线程里运行scrapy的方法
2015/04/07 Python
python 项目目录结构设置
2020/02/14 Python
使用python编写一个语音朗读闹钟功能的示例代码
2020/07/14 Python
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
文员个人求职自荐信
2013/09/21 职场文书
经典优秀个人求职自荐信格式
2013/09/25 职场文书
文员岗位职责范本
2014/03/08 职场文书
竞选劳动委员演讲稿
2014/04/28 职场文书
植树节口号
2014/06/21 职场文书
2015年安全生产责任书
2015/01/30 职场文书
工程合作意向书范本
2015/05/09 职场文书
建党伟业观后感
2015/06/01 职场文书
Element实现动态表格的示例代码
2021/08/02 Javascript