本文實例講述了AngularJS動態加載模塊和依賴的方法。分享給大家供大家參考,具體如下:
前言
由于AngularJS是單頁面應用框架,在正常的情況下,會在訪問頁面的時候將所有的CSS、JavaScript文件都加載進來。文件不多的時候,頁面啟動速度倒不會影響太多。但是一旦文件數太多或者加載的第三方庫比較大的時候,就會影響頁面啟動速度。因此對于應用規模大、文件數比較多或者加載的第三方庫比較大的時候,采用動態加載JS或者動態加載模塊會極大提升頁面的啟動速度。本文將介紹如何利用ocLazyLoad實現動態加載。
準備
AngularJS動態加載依賴第三方庫:ocLazyLoad。ocLazyLoad是一個第三方庫,支持AngularJS動態加載module、service、directive以及靜態文件。
安裝ocLazyLoad
可通過npm或者bower進行安裝
npm install oclazyloadbower install oclazyload
將ocLazyLoad module 添加到你的應用中
angular.module('myApp',['oc.lazyLoad']);
配置 ocLazyLoad
你可以在 config函數中配置 $ocLazyLoadProvider,配置文件如下
.config(['$ocLazyLoadProvider', function($ocLazyLoadProvider){ $ocLazyLoadProvider.config({ debug: true, events: true, modules: [ { name: 'TestModule', files: ['test.js'] } ] })}])
debug: 用來開啟debug模式。布爾值,默認是false。當開啟debug模式時,$ocLazyLoad會打印出所有的錯誤到console控制臺上。
events:當你動態加載了module的時候,$ocLazyLoad會廣播相應的事件。布爾值,默認為false。
modules:用于定義你需要動態加載的模塊。定義每個模塊的名字需要唯一。
modules必須要用數組的形式,其中files也必須以數組的形式存在,哪怕只需要加載一個文件
在路由當中加載module
.config(['$routeProvider', function($routeProvider) { $routeProvider.otherwise('/index'); $routeProvider.when('/index', { templateUrl: 'index.html', controller: 'IndexController', resolve: { // resolve 里的屬性如果返回的是 promise對象,那么resolve將會在view加載之前執行 loadMyCtrl: ['$ocLazyLoad', function($ocLazyLoad) { // 在這里可以延遲加載任何文件或者剛才預定義的modules return $ocLazyLoad.load('TestModule'); //加載剛才定義的TestModule /*return $ocLazyLoad.load([ // 如果要加載多個module,需要寫成數組的形式 'TestModule', 'MainModule' ]);*/ }] } })}])
resolve設置的屬性可以被注入到Controller當中。如果resolve返回的是promise對象的話,那么它們將在控制器加載以及$routeChangeSuccess被觸發之前執行。
$ocLazyLoad就是利用這個原理hack,進行動態加載。
resolve的值可以是:
* key,the value of key 是會被注入到Controller的依賴的名字;
* factory,即可以是一個service的名字,也可以是一個返回值,它是會被注入到控制器中的函數或可以被resolve的promise對象。
通過這樣的配置,就可以實現了AngularJS動態加載模塊和依賴。但是ocLazyLoad提供的功能更加豐富,不止動態加載模塊和依賴,還能動態加載service,diretive等。更多的功能,可以訪問[ocLazyLoad官網](https://oclazyload.readme.io)
希望本文所述對大家AngularJS程序設計有所幫助。
新聞熱點
疑難解答