angularjs 路由 异步加载js

摘要:
利用angularjs内置的$q服务,类似于es6中的promise,即创建异步加载,在加载完成后返回promise,通过promise来判断是否成功加载js,成功加载之后再赋给controller,程序写在route的resolve里。首先在页面引入ocLazyLoad.js、ui-router.然后建立modulevarapp=angular.module;functionasyncJS{//此处可以将路由异步加载js提到公共部分。

angularjs 异步加载js 有两种方法

第一种 使用$q 和 requireJS 加载

这个问题 首要出现 在 当我 把require 引入 项目中是,希望做到 点击路由时加载相应的页面html和 js.

起初我是将 route 的 controller 设置为 require(‘controller.js’) 来 异步加载,

当然,问题是不可能这么简单的,肯定要出现一些问题。

这样就出现一个问题,当 我路由子页面 中出现 与数据相关的 初始化时,第一次跳转是正常的,此时跳到其他页面,再跳回该页面时 controller的数据 却无法获取。

导致页面空白。

$routeProvider.when('/quick_set', {
           templateUrl: 'layout/quick_set.html',
           controller: require('quick_set')
  })

关于这个问题的解决我也看了很多的博客,找到了以下的解决方案。

利用 angularjs 内置的 $q 服务,类似于 es6 中的 promise,即创建异步加载,在 加载完成后返回 promise ,通过promise 来判断是否成功加载js,成功加载之后再 赋给controller,

程序写在 route 的 resolve 里。

1 $routeProvider.when('/quick_set', {
2                 templateUrl: 'layout/quick_set.html',
3                 controller: 'quick_set',
4 resolve: {
5                     loadController: app.asyncJS('quick_set')  //在这里 加入 异步请求
6 }
7             })
1 app.asyncJS = function(js) {
2   return function($q) {
3       var deferred =$q.defer();
4       require([js], function(controller) {
5               $controllerProvider.register(js, controller);      //由于是动态加载的controller,所以要先注册,再使用
6 deferred.resolve(); //将 返回的promise标记为 resolve 状态,即 成功状态,reject 问拒绝状态。
7 });
8        returndeferred.promise;
9 }
10 }

这样就成功的解决了这个问题。

第二种 使用ocLazyLoad.js 配合 ui-router 加载。

首先在页面引入 ocLazyLoad.js 、ui-router.

然后建立 module

var app = angular.module('myapp', ['ui.router', 'oc.lazyLoad']);
    functionasyncJS(js) { // 此处可以将路由 异步加载js 提到 公共部分。
        return ['$ocLazyLoad', function($ocLazyLoad) {
            return $ocLazyLoad.load('/luci-static/resources/modules/controllers/' + js + '.js'); //此为 加载路径
        }]
    }
    $urlRouterProvider.when('', '/quickSet');
    $stateProvider.state('quickSet', {
        url: '/quickSet',
        templateUrl: '/luci-static/resources/layout/quickSet.html',
        controller: 'quickSet', //此处函数名与加载的函数名一致。
        resolve: {  //在resolve 中 调用 
            loadController: asyncJS('quickSet')
        }
    })

这样当路由执行时,才加载子页面的controller。

子页面的controller 必须以 重新 绑定 app的congtroller 才会生效。

此为 子页面controller 的头部

angular.module('myapp', []).controller('quickSet', ['$scope', '$http', '$log', function ($scope, $http, $log) {}

免责声明:文章转载自《angularjs 路由 异步加载js》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Postman介绍(1)Linux 安装ActiveMQ(使用Mac远程访问)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JS兼容性问题(FF与IE)

不同浏览器中js兼容问题大全 1.document.formName.item('itemName')问题 说明: 1 //IE下(两种) 2 document.formName.item("itemName"); 3 document.formName.elements ["elementName"]; 4 //Firefox下 5 document.f...

js实现html转pdf+html2canvas.js截图不全的问题

最近做项目中遇到要把整个页面保存为PDF文件,网上找了一下实现的方法都是 html2canvas.js+jsPdf.js 来实现。实现的过程是 先用html2canvas.js把html页面转成图片,再用jsPdf.js把图片导出为pdf。 于是做了个小案例来测试这个功能。 <body> <!-- PDF -->...

Android 学习笔记之 JSON的序列化基本用法

最近在找怎样可以将一个数据对象通过WCF传给服务器,在网上看到了一个对象序列化成JSON的数据格式的帖子,这里整理下。 用到了JSON中的JSONStringer这个类,此类的主要功能就是可以快速的将一个数据类型序列化,成为一个标准的JSON数据。 其中需要注意的是: .object()和.endObject()必须同时使用,是为了按照Object标准给数值...

前端UI框架小汇总

前言: 近期,小弟根据GitHub、前端社区、掘金等平台对当前流行的前端UI框架的进行了小小的整理和汇总(ps:前端UI框架的应用是通过GitHub star数,社区热度和使用范围等进行的粗略的汇总【不分先后】)。希望对寻找UI框架的小伙伴们提供点帮助。 以下对前端UI框架的移动端、PC端和混合APP的应用进行了列举。 移动端UI框架 Mint UI(饿了...

JS实现“隐藏与显示”功能(多种方法)

1,通过按钮实现隐藏与显示: 这个是通过按钮点击实现的隐藏与显示,具体代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47...

js Base64与字符串互转

1、base64加密 在页面中引入base64.js文件,调用方法为: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>base64加密</title> <script type="text/jav...