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入门教程(5) js Screen屏幕对象
Jan 31 Javascript
原来Jquery.load的方法可以一直load下去
Mar 28 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
Sep 10 Javascript
Node.js插件安装图文教程
May 06 Javascript
如何理解jQuery中的ajaxSubmit方法
Mar 13 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
Aug 17 Javascript
vue结合Echarts实现点击高亮效果的示例
Mar 17 Javascript
深入理解Vue.js轻量高效的前端组件化方案
Dec 10 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
Dec 19 Javascript
JS获取动态添加元素的方法详解
Jul 31 Javascript
vantUI 获得piker选中值的自定义ID操作
Nov 04 Javascript
JavaScript声明变量和数据类型的转换
Apr 12 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实现通用的信用卡验证类
2015/03/24 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
广告代码静态化js通用函数
2007/05/09 Javascript
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
2010/08/27 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
jQuery中读取json文件示例代码
2013/05/10 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
javascript如何创建表格(javascript绘制表格的二种方法)
2013/12/10 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
jquery实现仿JqueryUi可拖动的DIV实例
2015/07/31 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
微信小程序 教程之引用
2016/10/18 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
利用JS制作万年历的方法
2017/08/16 Javascript
彻底搞懂JavaScript中的apply和call方法(必看)
2017/09/18 Javascript
五步轻松实现zTree的使用
2017/11/01 Javascript
详解express使用vue-router的history踩坑
2019/06/05 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
Django model反向关联名称的方法
2018/12/15 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
正宗的澳大利亚Ugg靴子零售商:UGG Express
2020/04/19 全球购物
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
电子信息毕业生自荐信
2013/11/16 职场文书
家长给幼儿园的表扬信
2014/01/09 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
买卖车协议书
2014/04/21 职场文书
一帮一活动总结
2014/05/08 职场文书
公司慰问信范文
2015/03/23 职场文书
装修安全责任协议书
2016/03/22 职场文书
解决mysql的int型主键自增问题
2021/07/15 MySQL
nginx服务器的下载安装与使用详解
2021/08/02 Servers