篇章二:[AngularJS] 使用AngularAMD動態載入Service
前言
「使用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的用法 - 阮一峰的网络日志)
define(["app"], function (app) {
});
接著在UserRepository.js裡,加入下列這個使用JavaScript物件導向語法寫出來的UserRepository類別,後續會使用這個UserRepository類別來提供系統服務的功能。(相關JavaScript物件導向語法的介紹,建議參考:JavaScript 設計模式 - Stoyan Stefanov)
// class
var UserRepository = (function () {
// constructors
function UserRepository() {
// users
this.users = new Array();
this.users.push({ name: "Clark", address: "Taipei" });
this.users.push({ name: "Jeff", address: "Kaohsiung" });
this.users.push({ name: "Jammy", address: "Taipei" });
}
// methods
UserRepository.prototype.getUserByName = function (name) {
// result
var result = null;
for (var key in this.users) {
if (this.users[key].name == name) {
result = this.users[key];
}
}
// return
return result;
};
// return
return UserRepository;
})();
最後在UserRepository.js裡面加入下列程式碼,使用AngularAMD所提供的app物件把UserRepository類別動態註冊成為Angular的一個服務。這個動態把UserRepository類別動態註冊成為Angular的服務的程式碼定義,會在UserRepository.js這個AMD格式檔案被加載後執行。(相關AngularAMD所提供的動態註冊功能,可以參考:AngularAMD:Creating a Module - marcoslin)
// register
app.service("UserRepository", [UserRepository]);
加載Service
完成Service的開發工作之後,接著就要在Controller裡使用上個步驟所建立的UserRepository。首先編輯工作資料夾內既有的about.js,並且將其中require語法的宣告定義,修改為下列的程式內容。在這段程式中"UserRepository"字串,代表的意義是使用require.js的功能,去動態加載UserRepository.js這個AMD格式檔案。
about.js
define(["UserRepository"], function () {
//...
});
動態加載UserRepository.js之後,系統就會依照程式碼定義,將UserRepository類別註冊成為Angular的一個服務。這時開發人員就可以修改about.js裡面的Controller宣告,使用Angular語法取得UserRepository服務來提供Controller使用。
about.js
// controller
return ["$scope", "UserRepository", function ($scope, UserRepository) { // properties
$scope.title = "This is About page";
$scope.user = UserRepository.getUserByName("Clark");
}];
about.html
<h1>{{ title }}</h1>
<h1>{{ user | json }}</h1>
<br/>
<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的更多相关文章
- 篇章一:[AngularJS] 使用AngularAMD動態載入Controller
前言 使用AngularJS來開發Single Page Application(SPA)的時候,可以選用AngularUI Router來提供頁面內容切換的功能.但是在UI Router的使用情景裡 ...
- 篇章三:[AngularJS] 使用AngularCSS動態載入CSS
前言 使用AngularAMD動態載入Controller 使用AngularAMD動態載入Service 上列兩篇文章裡,介紹了如何如何使用AngularAMD來動態載入Controller與Ser ...
- [Xamarin] 動態載入Fragment (转帖)
這篇我們來動態加入,一樣務求好懂簡單 1.一樣先將專案調整成3.0以上版本 2.首先建立自定Control的Layout \Resources\Layout\MyControlLayout1.axml ...
- Jquery easy ui datagrid動態加載列問題
1.如下图效果是当选择不同的日期范围时datagrid则会加载出对应的列数
- 小林的VB6動態壁紙模擬程序
本項目參考了以下資料[這可能對你理解程序運行有幫助]: https://github.com/Yinmany/WinWallpaper https://blog.csdn.net/breaksoftw ...
- JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (3):部署設定及應用 (转帖)
說明:這一篇主要是說明如何將程式部署到Application Server,以及程式如何運作,產生的檔案置於何處,以及如何以瀏覽器呈現(Applet),或是當成桌面應用程式,或是 桌面Applet,這 ...
- JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (2):JavaFX建立及程式碼說明 (转帖)
說明:就如同標題一樣,前端會用到JavaFX.Swing.Java Web Start.Google Map 的技術, 後端就是JDBC.Servlet的技術,以及我們會簽署認證jar檔案,這樣才可存 ...
- JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (1):NetBeans 寫 Servlet (转帖)
JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (1):NetBeans 寫 Servlet 功能:這支程式的主要功能是將 javafx 與 swi ...
- SQL Server 2016 的「動態資料遮罩 (Dynamic Data Masking)」
一些特別注重資訊安全.個人資料的公司或產業 (如: 金融.保險業),通常「測試用資料庫」的資料,會加上「遮蔽:去識別化」的功能,避免個資外洩.以往必須自己撰寫 SQL 語句或 Stored Proce ...
随机推荐
- Codeforces Round #191 (Div. 2) A. Flipping Game【*枚举/DP/每次操作可将区间[i,j](1=<i<=j<=n)内牌的状态翻转(即0变1,1变0),求一次翻转操作后,1的个数尽量多】
A. Flipping Game time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 【bzoj4720】【noip2016】【换座位】期望dp+Floyd
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62370736 wa...已经快一年了,重新来做这 ...
- [LOJ6281]数列分块入门 5
题目大意: 给你一个长度为$n(n\leq50000)$的序列$A(0\leq A_i<2^{31})$,支持进行以下两种操作: 1.将区间$[l,r]$中所有数开方: 2.询问区间$[l,r] ...
- Ubuntu 16.04出现:dpkg: 处理软件包 xxx (--configure)时出错:
如下所示: 解决方法: #将info文件夹更名 sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_old #再新建一个新的info文件夹 sudo mkdir ...
- SQL 存储过程(转帖摘录)
篇一: 创建存储过程 Create Proc dbo.存储过程名 存储过程参数 AS 执行语句 RETURN 执行存储过程 GO *********** ...
- 一个基于RSA算法的Java数字签名例子
原文地址:一个基于RSA算法的Java数字签名例子 一.前言: 网络数据安全包括数据的本身的安全性.数据的完整性(防止篡改).数据来源的不可否认性等要素.对数据采用加密算法加密可以保证数据本身的安全性 ...
- Java高级特性—JVM
1).java监控工具使用 jconsole是一种集成了上面所有命令功能的可视化工具,可以分析jvm的内存使用情况和线程等信息 visualvm 提供了和jconsole的功能类似,提供了一大堆的插件 ...
- .Net程序测试使用阿里云OCS开放缓存服务
首先需要有一个阿里的OCS实例和ECS云服务器 请确认这两个是在同一个可用区的,这个很重要! 这两个可以在阿里云官网申请得到 拿到OCS之后 进入OCS控制台,点击下面的客户端下载选择.Net客 ...
- 自己动手写android图片异步载入库
尊重他人劳动成果,转载请说明出处:http://blog.csdn.net/bingospunky/article/details/44344085 接触android有半年了.关于图片异步载入.一直 ...
- EffectiveJava(16)复合优先于继承
为什么复合优先于继承? 1.继承违反了封装原则,打破了封装性 2.继承会不必要的暴露API细节,称为隐患.比如通过直接访问底层使p.getProperty(K,V)的键值对可以不是String类型 3 ...