AngulerJS学习之按需动态加载文件

发布时间 - 2026-01-10 23:00:45    点击率:

在此之前我们首先要先了解几个东西:

$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_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# angularjs  # 按需加载  # angularjs按需加载js  # 异步加载  # AngularJS中的按需加载ocLazyLoad示例  # 探索angularjs+requirejs全面实现按需加载的套路  # AngularJS 实现按需异步加载实例代码  # 有个  # 这是  # 加载  # 往里  # 他就  # 你在  # 把它  # 给了  # 只有一个  # 要了  # 解决这个问题  # 可以用来  # 的是  # 完成了  # 几个  # 是个  # 不可能  # 我说  # 我觉得  # 都要 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何与Inertia.js和Vue/React构建现代单页应用  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  如何在服务器上三步完成建站并提升流量?  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  如何在万网主机上快速搭建网站?  jQuery中的100个技巧汇总  免费网站制作appp,免费制作app哪个平台好?  PHP正则匹配日期和时间(时间戳转换)的实例代码  香港服务器WordPress建站指南:SEO优化与高效部署策略  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  微信小程序 scroll-view组件实现列表页实例代码  iOS UIView常见属性方法小结  微信小程序 HTTPS报错整理常见问题及解决方案  Android实现代码画虚线边框背景效果  开心动漫网站制作软件下载,十分开心动画为何停播?  详解jQuery中基本的动画方法  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  敲碗10年!Mac系列传将迎来「触控与联网」双革新  如何基于PHP生成高效IDC网络公司建站源码?  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  jQuery validate插件功能与用法详解  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  企业网站制作这些问题要关注  Laravel如何使用模型观察者?(Observer代码示例)  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  如何在搬瓦工VPS快速搭建网站?  Bootstrap整体框架之CSS12栅格系统  移动端脚本框架Hammer.js  如何用虚拟主机快速搭建网站?详细步骤解析  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  南京网站制作费用,南京远驱官方网站?  如何在新浪SAE免费搭建个人博客?  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Python文件流缓冲机制_IO性能解析【教程】  如何在 Pandas 中基于一列条件计算另一列的分组均值  Laravel如何使用Gate和Policy进行授权?(权限控制)  制作公司内部网站有哪些,内网如何建网站?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  如何在七牛云存储上搭建网站并设置自定义域名?  js代码实现下拉菜单【推荐】  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  焦点电影公司作品,电影焦点结局是什么?