[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的更多相关文章

  1. [AngularJS] 使用AngularAMD动态加载Controller

    [AngularJS] 使用AngularAMD动态加载Controller 前言 使用AngularJS来开发Single Page Application(SPA)的时候,可以选用AngularU ...

  2. [AngularJS] 使用AngularCSS动态加载CSS

    [AngularJS] 使用AngularCSS动态加载CSS 前言 使用AngularAMD动态加载Controller 使用AngularAMD动态加载Service 上列两篇文章里,介绍了如何如 ...

  3. AngularJS+RequireJs实现动态加载JS和页面的方案研究【上】

    1.入口页面 存放地址:src/main/webapp/WEB-INF/view/workflow/workflow.jsp [html] view plain copy 在CODE上查看代码片派生到 ...

  4. AngularJS+RequireJs实现动态加载JS和页面的方案研究【中】

    3.动态加载的内容: home.js [html] view plain copy 在CODE上查看代码片派生到我的代码片 define(['app'], function(app) { app.co ...

  5. angularJS配合bootstrap动态加载弹出提示内容

    1.bootstrp的弹出提示 bootstrap已经帮我们封装了非常好用的弹出提示Popover. http://v3.bootcss.com/javascript/#popovers 2.自定义p ...

  6. AngularJS+RequireJs实现动态加载JS和页面的方案研究【下】

    about.js: [html] view plain copy 在CODE上查看代码片派生到我的代码片 define(['app'], function(app) { app.controller( ...

  7. AngularJs 动态加载模块和依赖

    最近项目比较忙额,白天要上班,晚上回来还需要做Angular知识点的ppt给同事,毕竟年底要辞职了,项目的后续开发还是需要有人接手的,所以就占用了晚上学习的时间.本来一直不打算写这些第三方插件的学习笔 ...

  8. AngularJS + ui-router + RequireJS异步加载注册controller/directive/filter/service

    一般情况下我们会将项目所用到的controller/directive/filter/sercive预先加载完再初始化AngularJS模块,但是当项目比较复杂的情况下,应该是打开对应的界面才加载对应 ...

  9. 黄聪:AngularJS 动态加载控制器实例-ocLoazLazy

    一.AngularJS动态加载控制器和视图实例 路由配置关键代码: //二级页面 $stateProvider.state('main', { url: '/:name', /**如果需要动态加载数据 ...

随机推荐

  1. BrowserSync前端调试工具使用

    上次介绍了一款DebugGap移动端调试工具DebugGap推荐.但是这几天使用了之后感觉还是有些不足,尤其是里面的调试工具虽然和Chrome里面的调试长的很像,但是多少有些不同,使用起来还是不太方便 ...

  2. Android开发实践:编译VLC-for-android

    最近在Android做流媒体相关的开发,一直想学习一下强大的VLC,正好趁此机会研究研究VLC-for-android的代码,看看优秀的开源音视频播放器是如何实现的.本文总结下在Linux平台下如何编 ...

  3. Uvaoj 10048 - Audiophobia(Floyd算法变形)

    1 /* 题目大意: 从一个点到达另一个点有多条路径,求这多条路经中最大噪音值的最小值! . 思路:最多有100个点,然后又是多次查询,想都不用想,Floyd算法走起! */ #include< ...

  4. 总结整理 -- python系列

    python系列 python--基础学习(一)开发环境搭建,体验HelloWorld python--基础学习(二)判断 .循环.定义函数.继承.调用 python--基础学习(三)字符串单引号.双 ...

  5. 关于pt与px

    pt:point,点,是印刷业一个标准的长度单位,1pt=1/72英寸:  在Windows里,默认的显示设置中,把文字定义为96dpi.这说明了:1px=1/96英寸:而1pt=1/72英寸,可以得 ...

  6. Visual Studio 选择相同变量高亮

    前段时间一直在使用matlab,今天需要使用vs2008,而用惯了matlab,习惯了其中一项选中变量高亮的设置,突然回来使用VS,感到各种不适应,顿时想到了一个词:矫情 呵呵,于是在网上找各种插件, ...

  7. Flume官方文档翻译——Flume 1.7.0 User Guide (unreleased version)(一)

    Flume 1.7.0 User Guide Introduction(简介) Overview(综述) System Requirements(系统需求) Architecture(架构) Data ...

  8. Visual C++ 6.0使用教程

    Visual C++它大概可以分成三个主要的部分: 3. Platform SDK.这才是Visual C++和整个Visual Studio的精华和灵魂,虽然我们很少能直接接触到它.大致说来,Pla ...

  9. [转载]AxureRP使用参考建议

    这些参照建议是马克总结出来的,我只是借用过来给大家参考,在此先感谢一下马克.对于很多学习或者刚使用AxureRP的产品经理们或者朋友们,总会有一些对于AxureRP该怎么使用的更合适想法,也有对Axu ...

  10. 机器学习&数据挖掘笔记_18(PGM练习二:贝叶斯网络在遗传图谱在的应用)

    前言: 这是coursera课程:Probabilistic Graphical Models上的第二个实验,主要是用贝叶斯网络对基因遗传问题进行一些计算.具体实验内容可参考实验指导教材:bayes ...