AngularJs 動態載入模塊和依賴註入

来源:http://www.cnblogs.com/ys-ys/archive/2016/01/10/5119086.html
-Advertisement-
Play Games

最近項目比較忙額,白天要上班,晚上回來還需要做Angular知識點的ppt給同事,畢竟年底要辭職了,項目的後續開發還是需要有人接手的,所以就占用了晚上學習的時間。本來一直不打算寫這些第三方的學習筆記,不過覺得按需載入模塊並且成功使用這個確實是個好處,還是記錄下來吧。基於本獸沒怎麼深入的使用requi...


最近項目比較忙額,白天要上班,晚上回來還需要做Angular知識點的ppt給同事,畢竟年底要辭職了,項目的後續開發還是需要有人接手的,所以就占用了晚上學習的時間。本來一直不打算寫這些第三方插件的學習筆記,不過覺得按需載入模塊並且成功使用這個確實是個好處,還是記錄下來吧。基於本獸沒怎麼深入的使用requireJs,所以本獸不知道這個和requireJs有什麼區別,也不能清晰的說明這到底算不算Angular的按需載入。

為了實現這篇學習筆記知識點的效果,我們需要用到:

angular:https://github.com/angular/angular.js

ui-router:https://github.com/angular-ui/ui-router

ocLazyLoad:https://github.com/ocombe/ocLazyLoad

廢話不多說,進入正題...

首先我們看下文件結構:

Angular-ocLazyLoad                      --- demo文件夾
    Scripts                             --- 框架及插件文件夾
        angular-1.4.7                   --- angular 不解釋
        angular-ui-router               --- uirouter 不解釋
        oclazyload                      --- ocLazyload 不解釋
        bootstrap                       --- bootstrap 不解釋
        angular-tree-control-master     --- angular-tree-control-master 不解釋
        ng-table                        --- ng-table 不解釋
        angular-bootstrap               --- angular-bootstrap 不解釋
    js                                  --- js文件夾 針對demo寫的js文件
        controllers                     --- 頁面控制器文件夾
            angular-tree-control.js     --- angular-tree-control控制器代碼
            default.js                  --- default控制器代碼
            ng-table.js                 --- ng-table控制器代碼
        app.config.js                   --- 模塊註冊及配置代碼
        oclazyload.config.js            --- 載入模塊配置代碼
        route.config.js                 --- 路由配置及載入代碼
    views                               --- html頁面文件夾
        angular-tree-control.html       --- angular-tree-control插件的效果頁面
        default.html                    --- default頁面
        ng-table.html                   --- ng-table插件效果頁面
        ui-bootstrap.html               --- uibootstrap插件效果頁面
    index.html                          --- 主頁面

註意:這個demo沒做嵌套路由,只是簡單實現單視圖的路由以展示效果。

我們來看主頁面的代碼:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="Scripts/bootstrap/dist/css/bootstrap.min.css" />
    <script src="Scripts/angular-1.4.7/angular.js"></script>
    <script src="Scripts/angular-ui-router/release/angular-ui-router.min.js"></script>
    <script src="Scripts/oclazyload/dist/ocLazyLoad.min.js"></script>
    <script src="js/app.config.js"></script>
    <script src="js/oclazyload.config.js"></script>
    <script src="js/route.config.js"></script>
</head>
<body>
<div ng-app="templateApp">
    <div>
        <a href="#/default">主頁</a>
        <a href="#/uibootstrap" >ui-bootstrap</a>
        <a href="#/ngtable">ng-table</a>
        <a href="#/ngtree">angular-tree-control</a>
    </div>
    <div ui-view></div>
</div>
</body>
</html>

在這個頁面,我們只載入了bootstrap的css、angular的js、ui-router的js、ocLazyLoad的js,以及3個配置的js文件。
再看看四個頁面的html代碼:
angular-tree-control效果頁面

  <treecontrol tree-model="ngtree.treeData" class="tree-classic ng-cloak" options="ngtree.treeOptions">
      {{node.title}}
  </treecontrol>

頁面上有個使用該插件對應的指令。
default頁面

  <div class="ng-cloak">
      {{default.value}}
  </div>

這裡我們只是用來證明載入並正確執行default.js。
ng-table效果頁面

<div class="ng-cloak">
    <div class="p-h-md p-v bg-white box-shadow pos-rlt">
        <h3 class="no-margin">ng-table</h3>
    </div>
    <button ng-click="ngtable.tableParams.sorting({})" class="btn btn-default pull-right">Clear sorting</button>
    <p>
        <strong>Sorting:</strong> {{ngtable.tableParams.sorting()|json}}
    </p>
    <table ng-table="ngtable.tableParams" class="table table-bordered table-striped">
        <tr ng-repeat="user in $data">
            <td data-title="'Name'" sortable="'name'">
                {{user.name}}
            </td>
            <td data-title="'Age'" sortable="'age'">
                {{user.age}}
            </td>
        </tr>
    </table>
</div>

這裡寫了些簡單的ng-table效果。
ui-bootstrap效果頁面

  <span uib-dropdown class="ng-cloak">
      <a href id="simple-dropdown" uib-dropdown-toggle>
          下拉框觸發
      </a>
      <ul class="uib-dropdown-menu dropdown-menu" aria-labelledby="simple-dropdown">
          下拉框內容.這裡寫個效果證明實現動態載入即可
      </ul>
  </span>

這裡僅寫了個下拉框效果,證明正確載入並使用該插件。
好了,看完了html,我們看下載入配置和路由配置

"use strict"
var tempApp = angular.module("templateApp",["ui.router","oc.lazyLoad"])
.config(["$provide","$compileProvider","$controllerProvider","$filterProvider",
                function($provide,$compileProvider,$controllerProvider,$filterProvider){
                    tempApp.controller = $controllerProvider.register;
                    tempApp.directive = $compileProvider.directive;
                    tempApp.filter = $filterProvider.register;
                    tempApp.factory = $provide.factory;
                    tempApp.service  =$provide.service;
                    tempApp.constant = $provide.constant;
                }]);

以上代碼對模塊的註冊,僅僅依賴了ui.router和oc.LazyLoad。配置也只是簡單配置了模塊,以便在後面的js能識別到tempApp上的方法。
然後我們再看看ocLazyLoad載入模塊的配置

"use strict"
tempApp
.constant("Modules_Config",[
    {
        name:"ngTable",
        module:true,
        files:[
            "Scripts/ng-table/dist/ng-table.min.css",
            "Scripts/ng-table/dist/ng-table.min.js"
        ]
    },
    {
        name:"ui.bootstrap",
        module:true,
        files:[
            "Scripts/angular-bootstrap/ui-bootstrap-tpls-0.14.3.min.js"
        ]
    },
    {
        name:"treeControl",
        module:true,
        files:[
            "Scripts/angular-tree-control-master/css/tree-control.css",
            "Scripts/angular-tree-control-master/css/tree-control-attribute.css",
            "Scripts/angular-tree-control-master/angular-tree-control.js"
        ]
    }
])
.config(["$ocLazyLoadProvider","Modules_Config",routeFn]);
function routeFn($ocLazyLoadProvider,Modules_Config){
    $ocLazyLoadProvider.config({
        debug:false,
        events:false,
        modules:Modules_Config
    });
};

路由的配置

"use strict"
tempApp.config(["$stateProvider","$urlRouterProvider",routeFn]);
function routeFn($stateProvider,$urlRouterProvider){
    $urlRouterProvider.otherwise("/default");
    $stateProvider
    .state("default",{
        url:"/default",
        templateUrl:"views/default.html",
        controller:"defaultCtrl",
        controllerAs:"default",
        resolve:{
            deps:["$ocLazyLoad",function($ocLazyLoad){
                return $ocLazyLoad.load("js/controllers/default.js");
            }]
        } 
    })
    .state("uibootstrap",{
        url:"/uibootstrap",
        templateUrl:"views/ui-bootstrap.html",
        resolve:{
            deps:["$ocLazyLoad",function($ocLazyLoad){
                return $ocLazyLoad.load("ui.bootstrap");
            }]
        } 
    })
    .state("ngtable",{
        url:"/ngtable",
        templateUrl:"views/ng-table.html",
        controller:"ngTableCtrl",
        controllerAs:"ngtable",
        resolve:{
            deps:["$ocLazyLoad",function($ocLazyLoad){
                return $ocLazyLoad.load("ngTable").then(
                    function(){
                        return $ocLazyLoad.load("js/controllers/ng-table.js");
                    }
                );
            }]
        } 
    })
    .state("ngtree",{
        url:"/ngtree",
        templateUrl:"views/angular-tree-control.html",
        controller:"ngTreeCtrl",
        controllerAs:"ngtree",
        resolve:{
            deps:["$ocLazyLoad",function($ocLazyLoad){
                return $ocLazyLoad.load("treeControl").then(
                    function(){
                        return $ocLazyLoad.load("js/controllers/angular-tree-control.js");
                    }
                );
            }]
        } 
    })
};

ui-bootstrap的下拉框簡單的實現不需要控制器,那麼我們就只看看ng-table和angular-tree-control的控制器js吧:
ng-table.js

(function(){
"use strict"
tempApp
.controller("ngTableCtrl",["$location","NgTableParams","$filter",ngTableCtrlFn]);
function ngTableCtrlFn($location,NgTableParams,$filter){
    var vm = this;
    //數據
    var data = [{ name: "Moroni", age: 50 },
                 { name: "Tiancum ", age: 43 },
                 { name: "Jacob", age: 27 },
                 { name: "Nephi", age: 29 },
                 { name: "Enos", age: 34 },
                 { name: "Tiancum", age: 43 },
                 { name: "Jacob", age: 27 },
                 { name: "Nephi", age: 29 },
                 { name: "Enos", age: 34 },
                 { name: "Tiancum", age: 43 },
                 { name: "Jacob", age: 27 },
                 { name: "Nephi", age: 29 },
                 { name: "Enos", age: 34 },
                 { name: "Tiancum", age: 43 },
                 { name: "Jacob", age: 27 },
                 { name: "Nephi", age: 29 },
                 { name: "Enos", age: 34 }];
    vm.tableParams = new NgTableParams(    // 合併預設的配置和url參數
        angular.extend({
            page: 1,            // 第一頁
            count: 10,          // 每頁的數據量
            sorting: {
                name: 'asc'     // 預設排序
            }
        },
        $location.search())
        ,{
            total: data.length, // 數據總數
            getData: function ($defer, params) {
                $location.search(params.url()); // 將參數放到url上,實現刷新頁面不會跳回第一頁和預設配置
                var orderedData = params.sorting ?
                        $filter('orderBy')(data, params.orderBy()) :data;
                $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
            }
        }
    );
};
})();

angular-tree-control.js

(function(){
"use strict"
tempApp
.controller("ngTreeCtrl",ngTreeCtrlFn);
function ngTreeCtrlFn(){
    var vm = this;
    //樹數據
    vm.treeData = [
                {
                    id:"1",
                    title:"標簽1",
                    childList:[
                        {
                            id:"1-1",
                            title:"子級1",
                            childList:[
                                {
                                    id:"1-1-1",
                                    title:"再子級1",
                                    childList:[]
                                }
                            ]
                        },
                        {
                            id:"1-2",
                            title:"子級2",
                            childList:[
                                {
                                    id:"1-2-1",
                                    title:"再子級2",
                                    childList:[
                                        {
                                            id:"1-2-1-1",
                                            title:"再再子級1",
                                            childList:[]
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            id:"1-3",
                            title:"子級3",
                            childList:[]
                        }
                    ]
                },
                {
                    id:"2",
                    title:"標簽2",
                    childList:[
                        {
                            id:"2-1",
                            title:"子級1",
                            childList:[]
                        },
                        {
                            id:"2-2",
                            title:"子級2",
                            childList:[]
                        },
                        {
                            id:"2-3",
                            title:"子級3",
                            childList:[]
                        }
                    ]}
                ,
                {
                    id:"3",
                    title:"標簽3",
                    childList:[
                        {
                            id:"3-1",
                            title:"子級1",
                            childList:[]
                        },
                        {
                            id:"3-2",
                            title:"子級2",
                            childList:[]
                        },
                        {
                            id:"3-3",
                            title:"子級3",
                            childList:[]
                        }
                    ]
                }
            ];
    //樹配置
    vm.treeOptions = {
      nodeChildren:"childList",
        dirSelectable:false
    };
};
})();

讓我們忽略default.js吧,畢竟裡面只有個"Hello Wrold"。

github url : https://github.com/Program-Monkey/Angular-ocLazyLoad-Demo

本獸的相關文章AngularJs ui-router 路由的簡單介紹  野獸的 Angular 學習 - - ngRoute Angular自帶的路由


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這兩天好好的研究了下推送這功能,關於它我將分成兩部分來講,一、IOS手機端,二、Servlet服務端,今天先講下IOS端一、感受下麵講下我對推送這個功能在IOS下的感受,這個算是我做了服務端的功能和手機端的功能後的一個體會吧, 這功能在IOS上是多少給我帶來了點雞肋的感覺,首先很多時候收到推送有延時...
  • 剛開始android編程的時候, 關於ImageView.ScaleType網路上好多, 說實話沒看懂. 本文就是為了講清楚這個, 有用的話轉走, 請註明原地址和作者.
  • 終於學到事件了,不知道為何聽到“事件”就有一種莫名的興奮。可能是之前的那些知識點過於枯燥無味吧,說起事件感覺頓時高大上了。今天我們就來好好分析下這個高大上的東西。 可以說,如果沒有事件我們的頁面就只能閱讀了。有了事件,我們可以通過鍵盤或是滑鼠和頁面交互了,通過我們不同的操作頁面給出不同的響應。 ...
  • 前幾年,我有機會能參與一些有趣的項目,並且獨立完成開發、升級、重構以及新功能的開發等工作。 本文總結了一些PHP程式員在Web開發中經常 忽略的關鍵錯誤,尤其是在處理中大型的項目上問題更為突出。典型的錯誤表現在不能很好區分各種開發環境和沒有使用緩存和備份等。 下麵以PHP為例,但是其核心思想對每.....
  • 1. Append Outside of Loops凡是觸及到DOM都是有代價的。如果你向DOM當中附加大量的元素,你會想一次性將它們全部附加進來,而不是分多次進行。當在迴圈當中附加元素就會產生一個常見的問題。1 $.each( myArray, function( i, item ) {2 3 ....
  • WebBrowser是IE內置的瀏覽器控制項,無需用戶下載.一、WebBrowser控制項 二、WebBrowder控制項的方法 //列印WebBrowser1.ExecWB(6,1);//列印設置WebBrowser1.ExecWB(8,1);//列印預覽WebBrowser1.ExecWB(7,1.....
  • 1.重置瀏覽器的字體大小重置瀏覽器的預設值 ,然後重設瀏覽器的字體大小你可以使用雅虎的用戶界面重置的CSS方案 ,如果你不想下載9MB的文件,代碼如下:body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,texta...
  • 摘要: 由於手機上打字比較慢,並不適合長篇大論的文章,所以移動端的富文本編輯器很少。artEditor是一款基於jQuery的移動端富文本編輯器,支持插入圖片,後續完善其他功能。插件地址:https://github.com/baixuexiyang/artEditor 歡迎star或fork。.....
一周排行
    -Advertisement-
    Play Games
  • JWT(JSON Web Token)是一種用於在網路應用之間傳遞信息的開放標準(RFC 7519)。它使用 JSON 對象在安全可靠的方式下傳遞信息,通常用於身份驗證和信息交換。 在Web API中,JWT通常用於對用戶進行身份驗證和授權。當用戶登錄成功後,伺服器會生成一個Token並返回給客戶端 ...
  • 老周在幾個世紀前曾寫過樹莓派相關的 iOT 水文,之所以沒寫 Nano Framework 相關的內容,是因為那時候這貨還不成熟,可玩性不高。不過,這貨現在已經相對完善,老周都把它用在項目上了——第一個是自製的智能插座,這個某寶上50多塊可以買到,搜“esp32 插座”就能找到。一種是 86 型盒子 ...
  • 引言 上一篇我們創建了一個Sample.Api項目和Sample.Repository,並且帶大家熟悉了一下Moq的概念,這一章我們來實戰一下在xUnit項目使用依賴註入。 Xunit.DependencyInjection Xunit.DependencyInjection 是一個用於 xUnit ...
  • 在 Avalonia 中,樣式是定義控制項外觀的一種方式,而控制項主題則是一組樣式和資源,用於定義應用程式的整體外觀和感覺。本文將深入探討這些概念,並提供示例代碼以幫助您更好地理解它們。 樣式是什麼? 樣式是一組屬性,用於定義控制項的外觀。它們可以包括背景色、邊框、字體樣式等。在 Avalonia 中,樣 ...
  • 在處理大型Excel工作簿時,有時候我們需要在工作表中凍結窗格,這樣可以在滾動查看數據的同時保持某些行或列固定不動。凍結窗格可以幫助我們更容易地導航和理解複雜的數據集。相反,當你不需要凍結窗格時,你可能需要解凍它們以獲得完整的視野。 下麵將介紹如何使用免費.NET庫通過C#實現凍結Excel視窗以鎖 ...
  • .NET 部署 IIS 的簡單步驟一: 下載 dotnet-hosting-x.y.z-win.exe ,下載地址:.NET Downloads (Linux, macOS, and Windows) (microsoft.com) .NET 部署 IIS 的簡單步驟二: 選擇對應的版本,點擊進入詳 ...
  • 拓展閱讀 資料庫設計工具-08-概覽 資料庫設計工具-08-powerdesigner 資料庫設計工具-09-mysql workbench 資料庫設計工具-10-dbdesign 資料庫設計工具-11-dbeaver 資料庫設計工具-12-pgmodeler 資料庫設計工具-13-erdplus ...
  • 初識STL STL,(Standard Template Library),即"標準模板庫",由惠普實驗室開發,STL中提供了非常多對信息學奧賽很有用的東西。 vector vetor是STL中的一個容器,可以看作一個不定長的數組,其基本形式為: vector<數據類型> 名字; 如: vector ...
  • 前言 最近自己做了個 Falsk 小項目,在部署上伺服器的時候,發現雖然不乏相關教程,但大多都是將自己項目代碼複製出來,不講核心邏輯,不太簡潔,於是將自己部署的經驗寫成內容分享出來。 uWSGI 簡介 uWSGI: 一種實現了多種協議(包括 uwsgi、http)並能提供伺服器搭建功能的 Pytho ...
  • 1 文本Embedding 將整個文本轉化為實數向量的技術。 Embedding優點是可將離散的詞語或句子轉化為連續的向量,就可用數學方法來處理詞語或句子,捕捉到文本的語義信息,文本和文本的關係信息。 ◉ 優質的Embedding通常會讓語義相似的文本在空間中彼此接近 ◉ 優質的Embedding相 ...