前言

使用AngularAMD動態載入Controller」:這篇文章裡介紹如何使用AngularAMD來動態載入Controller。本篇文章以此為基礎,介紹如何使用AngularAMD來動態載入Service,讓SPA的啟動過程更加輕量化,用以提升使用者的操作體驗。並且也透過這樣掛載式的設計,讓專案功能更加模組化,增加開發與維護的工作效率。主要為自己留個紀錄,也希望能幫助到有需要的開發人員。

安裝

本篇文章以「使用AngularAMD動態載入Controller」的範例程式為基礎,為其附加動態載入Service的功能。進入本篇的開發步驟之前,開發人員可以先依照上一篇文章的步驟來建立基礎架構。

動態載入Controller範例:點此下載

開發Service

取得基礎架構之後,在工作資料夾內新增一個UserRepository.js檔案,用來定義動態掛載的Service:UserRepository物件。

首先要在UserRepository.js裡面加入下列require+AngularAMD語法,用來將UserRepository.js包裝成為可以動態加載執行的AMD格式模組,並且注入AngularAMD所提供的app物件用來提供動態註冊Servive的功能。(相關require.js的使用介紹,可以參考:require.js的用法 - 阮一峰的网络日志)

  1. define(["app"], function (app) {
  2. });

接著在UserRepository.js裡,加入下列這個使用JavaScript物件導向語法寫出來的UserRepository類別,後續會使用這個UserRepository類別來提供系統服務的功能。(相關JavaScript物件導向語法的介紹,建議參考:JavaScript 設計模式 - Stoyan Stefanov)

  1. // class
  2. var UserRepository = (function () {
  3. // constructors
  4. function UserRepository() {
  5. // users
  6. this.users = new Array();
  7. this.users.push({ name: "Clark", address: "Taipei" });
  8. this.users.push({ name: "Jeff", address: "Kaohsiung" });
  9. this.users.push({ name: "Jammy", address: "Taipei" });
  10. }
  11. // methods
  12. UserRepository.prototype.getUserByName = function (name) {
  13. // result
  14. var result = null;
  15. for (var key in this.users) {
  16. if (this.users[key].name == name) {
  17. result = this.users[key];
  18. }
  19. }
  20. // return
  21. return result;
  22. };
  23. // return
  24. return UserRepository;
  25. })();

最後在UserRepository.js裡面加入下列程式碼,使用AngularAMD所提供的app物件把UserRepository類別動態註冊成為Angular的一個服務。這個動態把UserRepository類別動態註冊成為Angular的服務的程式碼定義,會在UserRepository.js這個AMD格式檔案被加載後執行。(相關AngularAMD所提供的動態註冊功能,可以參考:AngularAMD:Creating a Module - marcoslin)

  1. // register
  2. app.service("UserRepository", [UserRepository]);

加載Service

完成Service的開發工作之後,接著就要在Controller裡使用上個步驟所建立的UserRepository。首先編輯工作資料夾內既有的about.js,並且將其中require語法的宣告定義,修改為下列的程式內容。在這段程式中"UserRepository"字串,代表的意義是使用require.js的功能,去動態加載UserRepository.js這個AMD格式檔案。

  • about.js

    1. define(["UserRepository"], function () {
    2. //...
    3. });

動態加載UserRepository.js之後,系統就會依照程式碼定義,將UserRepository類別註冊成為Angular的一個服務。這時開發人員就可以修改about.js裡面的Controller宣告,使用Angular語法取得UserRepository服務來提供Controller使用。

  • about.js

    1. // controller
    2. return ["$scope", "UserRepository", function ($scope, UserRepository) {
    3. // properties
    4. $scope.title = "This is About page";
    5. $scope.user = UserRepository.getUserByName("Clark");
    6. }];
  • about.html

    1. <h1>{{ title }}</h1>
    2. <h1>{{ user | json }}</h1>
    3. <br/>
    4. <button ui-sref="home">Home</button>

執行

完成開發步驟後,就可以準備使用Chrome執行index.html來檢視成果。但是在檢視成果之前,必須要先參考下列資料開啟Chrome的必要功能,後續就使用Chrome來正常的執行index.html。

執行index.html之後,會系統依照路由設定進入預設的Home頁面。而使用Chrome的開發者工具,可以看到系統加載了Home頁面的Template、Controller,並且顯示在頁面上。

點擊Home頁面的About按鈕,會切換到About頁面。這時同樣從Chrome的開發者工具中,可以看到系統是在點擊了About按鈕之後,才去加載About頁面的Template、Controller、以及額外的UserRepository來提供服務,這也就是AngularAMD所提供的動態載入Service功能。

範例下載

範例檔案:點此下載

篇章二:[AngularJS] 使用AngularAMD動態載入Service的更多相关文章

  1. 篇章一:[AngularJS] 使用AngularAMD動態載入Controller

    前言 使用AngularJS來開發Single Page Application(SPA)的時候,可以選用AngularUI Router來提供頁面內容切換的功能.但是在UI Router的使用情景裡 ...

  2. 篇章三:[AngularJS] 使用AngularCSS動態載入CSS

    前言 使用AngularAMD動態載入Controller 使用AngularAMD動態載入Service 上列兩篇文章裡,介紹了如何如何使用AngularAMD來動態載入Controller與Ser ...

  3. [Xamarin] 動態載入Fragment (转帖)

    這篇我們來動態加入,一樣務求好懂簡單 1.一樣先將專案調整成3.0以上版本 2.首先建立自定Control的Layout \Resources\Layout\MyControlLayout1.axml ...

  4. Jquery easy ui datagrid動態加載列問題

    1.如下图效果是当选择不同的日期范围时datagrid则会加载出对应的列数

  5. 小林的VB6動態壁紙模擬程序

    本項目參考了以下資料[這可能對你理解程序運行有幫助]: https://github.com/Yinmany/WinWallpaper https://blog.csdn.net/breaksoftw ...

  6. JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (3):部署設定及應用 (转帖)

    說明:這一篇主要是說明如何將程式部署到Application Server,以及程式如何運作,產生的檔案置於何處,以及如何以瀏覽器呈現(Applet),或是當成桌面應用程式,或是 桌面Applet,這 ...

  7. JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (2):JavaFX建立及程式碼說明 (转帖)

    說明:就如同標題一樣,前端會用到JavaFX.Swing.Java Web Start.Google Map 的技術, 後端就是JDBC.Servlet的技術,以及我們會簽署認證jar檔案,這樣才可存 ...

  8. JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (1):NetBeans 寫 Servlet (转帖)

    JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (1):NetBeans 寫 Servlet 功能:這支程式的主要功能是將 javafx 與 swi ...

  9. SQL Server 2016 的「動態資料遮罩 (Dynamic Data Masking)」

    一些特別注重資訊安全.個人資料的公司或產業 (如: 金融.保險業),通常「測試用資料庫」的資料,會加上「遮蔽:去識別化」的功能,避免個資外洩.以往必須自己撰寫 SQL 語句或 Stored Proce ...

随机推荐

  1. 牛客小白月赛3 I 排名【结构体排序/较复杂/细节】

    链接:https://www.nowcoder.com/acm/contest/87/I 来源:牛客网 题目描述 Cwbc和XHRlyb都参加了SDOI2018,他们特别关心自己的排名. 我们定义每一 ...

  2. POJ 2337 Catenyms (欧拉图)

    本文链接http://i.cnblogs.com/EditPosts.aspx?postid=5402042 题意: 给你N个单词,让你把这些单词排成一个序列,使得每个单词的第一个字母和上一个字单词的 ...

  3. Python的程序结构[1] -> 方法/Method[2] -> 魔术方法 __init__ / __del__ / __new__

    魔术方法 / Magic Method 魔法方法就是可以给你的类增加魔力的特殊方法(实质应称为特殊方法,魔术方法在JavaScript中有所体现,对象具有不透明特性,而且无法在自定义对象中模拟这些行为 ...

  4. Codeforces 825E - Minimal Labels

    825E - Minimal Labels 题意 给出 m 条有向边,组成有向无环图,输出一个 1 到 n 组成的排列,每个数只能出现一次,表示每个点的标号.如果有边 \((u, v)\) 那么 \( ...

  5. ARM32 Linux kernel virtual address space

    http://thinkiii.blogspot.jp/2014/02/arm32-linux-kernel-virtual-address-space.html   The 32-bit ARM C ...

  6. mysql系列-安装及服务启动

    一.window下的安装 详细见官网 https://dev.mysql.com/doc/refman/5.7/en/windows-installation.html 以 MySQL 5.1 免安装 ...

  7. Cocos2dx 粒子销毁问题

    Cocos2dx    粒子销毁问题 DionysosLai(906391500@qq.com) 2014-7-3 之前在调试粒子特效时,在粒子编辑器有个选项是用来调整粒子的生命时间,当粒子存在的时间 ...

  8. 文件流:"fopen","fclose",“ftell”"fseek","fgets","fprintf" ,“feof”,"fwrite","fread"

    char const* filename="D:/hello.txt"; 路径名使用的是“/”或者使用 转义字符“\\”: "fopen", FILE *fp= ...

  9. CSS从大图片上截取小图标

    一张图片,用CSS分割成多个小图标. css样式: .icon{ background:url(../images/tabicons.png) no-repeat;width:18px; line-h ...

  10. tensorflow TensorArray 代码例子

    import tensorflow as tf import numpy as np B=3 D=4 T=5 tf.reset_default_graph() xs=tf.placeholder(sh ...