AngularJS进阶(四十)创建模块、服务
AngularJS进阶(四十)创建模块、服务
学习要点
使用模块构架应用
创建和使用服务
为什么要使用和创建服务与模块?
服务允许你打包可重用的功能,使之能在此应用中使用。
模块允许你打包可重用的功能,使之能跨应用使用。
一、应用程序模块化
先看看一个没有模块化的程序
<!DOCTYPE>
<!-- use module -->
<html ng-app="exampleApp">
<head>
<title>Angluar test</title>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="css/bootstrap-theme.min.css">
</head>
<body ng-controller="defaultCtrl">
<div class="well">
<!-- 使用自定义指令 -->
<div class="btn-group" tri-button counter="data.totalClicks">
<!-- 遍历按钮 -->
<button class="btn btn-default" ng-repeat="city in data.cities">
{{city}}
</button>
</div>
<h5>Total Clicks: {{data.totalClicks}}</h5>
</div>
<script type="text/javascript" src="js/angular.min.js"></script>
<script type="text/javascript">
angular.module("exampleApp", [])
.controller("defaultCtrl", function ($scope) {
// 数据模型
$scope.data = {
// 城市
cities : ["London", "New York", "Paris"],
// 点击总数
totalClicks : 0
};
// 添加监听器,当点击总数发生变化时触发工厂函数
$scope.$watch("data.totalClicks", function (newVal) {
console.log("Total click count: " + newVal);
});
})
// 定义指令
.directive("triButton", function () {
return {
// 隔离作用域
// 双向数据绑定
scope : {
counter : "=counter"
},
// 链式函数
link : function (scope, element, attrs) {
// 点击事件监听,打印日记,计算累加
element.on("click", function (e) {
console.log("Button click: " + e.target.innerText);
scope.$apply(function () {
scope.counter++;
})
});
}
}
})
</script>
</body>
</html>
单击城市按钮,递增点击总数
接下来,我们将指令分离,使之模块化,我们命名为triButtonDirective.js
angular.module("triButtonDir", [])
.directive("triButton", function () {
return {
// 隔离作用域
// 双向数据绑定
scope : {
counter : "=counter"
},
// 链式函数
link : function (scope, element, attrs) {
// 点击事件监听,打印日记,计算累加
element.on("click", function (e) {
console.log("Button click: " + e.target.innerText);
scope.$apply(function () {
scope.counter++;
})
});
}
}
})
接下来,引用定义的标签并且使用它
<!-- 引入指令文件 -->
<script type="text/javascript" src="js/triButtonDirective.js"></script>
<script type="text/javascript">
// 使用指令
angular.module("exampleApp", ["triButtonDir"])
二、创建使用服务
1.使用Factory方法
第一步:将服务模块化,这里创建一个名为triButtonFactory.js的文件
angular.module("triButtonFactory", [])
.factory("logService", function () {
var messageCount = 0;
return {
log : function (msg) {
console.log("(Log + " + messageCount++ + ") " + msg);
}
}
})
第二步:在视图中引入该服务
<script type="text/javascript" src="js/triButtonFactory.js"></script>
第三步:在控制器中使用它
// 参数依赖注入
angular.module("exampleApp", ["triButtonDirective", "triButtonFactory"])
// 作为参数传人控制器中
.controller("defaultCtrl", function ($scope, logService) {
// 数据模型
$scope.data = {
// 城市
cities : ["London", "New York", "Paris"],
// 点击总数
totalClicks : 0
};
// 添加监听器,当点击总数发生变化时触发工厂函数
$scope.$watch("data.totalClicks", function (newVal) {
// console.log("Total click count: " + newVal);
// 使用自定义服务
logService.log("Total click count: " + newVal);
});
})
2.使用Service方法
第一步:创建构造函数,然后创建服务。我们命名为triButtonService.js
var baseLogger = function () {
this.messageCount = 0;
this.log = function (msg) {
console.log(this.msgType + ": " + (this.messageCount++) + " " + msg);
}
}
var debugLogger = function () {};
debugLogger.prototype = new baseLogger();
debugLogger.prototype.msgType = "Debug";
var errorLogger = function () {};
errorLogger.prototype = new baseLogger();
errorLogger.prototype.msgType = "Error";
angular.module("triButtonService", [])
.service("logService", debugLogger)
第二步:引入triButtonService.js文件,然后使用服务
<!DOCTYPE>
<!-- use module -->
<html ng-app="exampleApp">
<head>
<title>Angluar test</title>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="css/bootstrap-theme.min.css">
</head>
<body ng-controller="defaultCtrl">
<div class="well">
<!-- 使用自定义指令 -->
<div class="btn-group" tri-button counter="data.totalClicks">
<!-- 遍历按钮 -->
<button class="btn btn-default" ng-repeat="city in data.cities">
{{city}}
</button>
</div>
<h5>Total Clicks: {{data.totalClicks}}</h5>
</div>
<script type="text/javascript" src="js/angular.min.js"></script>
<!-- 引入指令文件 -->
<script type="text/javascript" src="js/triButtonDirective.js"></script>
<script type="text/javascript" src="js/triButtonService.js"></script>
<script type="text/javascript">
// 使用指令
angular.module("exampleApp", ["triButtonDirective", "triButtonService"])
.controller("defaultCtrl", function ($scope, logService) {
// 数据模型
$scope.data = {
// 城市
cities : ["London", "New York", "Paris"],
// 点击总数
totalClicks : 0
};
// 添加监听器,当点击总数发生变化时触发工厂函数
$scope.$watch("data.totalClicks", function (newVal) {
// console.log("Total click count: " + newVal);
// 使用自定义服务
logService.log("Total click count: " + newVal);
});
})
</script>
</body>
</html>
3.使用Provider方法
第一步:使用Provider,创建服务。我们命名为triButtonProvider.js
angular.module("triButtonProvider", [])
.provider("logService", function () {
var counter = true;
var debug = true;
return {
messageCounterEnabled : function (setting) {
if (angular.isDefined(setting)) {
counter = setting;
return this;
} else {
return counter;
}
},
debugEnabled : function (setting) {
if (angular.isDefined(setting)) {
debug = setting;
return this;
} else {
return debug;
}
},
// 用于返回服务对象
$get : function () {
return {
messageCount : 0,
log : function (msg) {
if (debug) {
console.log("(LOG" + (counter ? " + " + this.messageCount++ + ") " : ") " + msg));
}
}
}
}
}
})
第二步:引入、配置和使用服务
<!DOCTYPE>
<!-- use module -->
<html ng-app="exampleApp">
<head>
<title>Angluar test</title>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="css/bootstrap-theme.min.css">
</head>
<body ng-controller="defaultCtrl">
<div class="well">
<!-- 使用自定义指令 -->
<div class="btn-group" tri-button counter="data.totalClicks">
<!-- 遍历按钮 -->
<button class="btn btn-default" ng-repeat="city in data.cities">
{{city}}
</button>
</div>
<h5>Total Clicks: {{data.totalClicks}}</h5>
</div>
<script type="text/javascript" src="js/angular.min.js"></script>
<!-- 引入指令文件 -->
<script type="text/javascript" src="js/triButtonDirective.js"></script>
<script type="text/javascript" src="js/triButtonProvider.js"></script>
<script type="text/javascript">
// 使用指令
angular.module("exampleApp", ["triButtonDirective", "triButtonProvider"])
// 使提供强对象适用于依赖注入,服务器 + Provider = logServiceProvider
.config(function (logServiceProvider) {
logServiceProvider.debugEnabled(true).messageCounterEnabled(false);
})
.controller("defaultCtrl", function ($scope, logService) {
// 数据模型
$scope.data = {
// 城市
cities : ["London", "New York", "Paris"],
// 点击总数
totalClicks : 0
};
// 添加监听器,当点击总数发生变化时触发工厂函数
$scope.$watch("data.totalClicks", function (newVal) {
// console.log("Total click count: " + newVal);
// 使用自定义服务
logService.log("Total click count: " + newVal);
});
})
</script>
</body>
</html>
美文美图
AngularJS进阶(四十)创建模块、服务的更多相关文章
- 网站开发进阶(四十四)input type="submit" 和"button"的区别
网站开发进阶(四十四)input type="submit" 和"button"的区别 在一个页面上画一个按钮,有四种办法: 这就是一个按钮.如果你不写ja ...
- Java进阶(四十)Java类、变量、方法修饰符讲解
Java进阶(四十)Java类.变量.方法修饰符讲解 Java类修饰符 abstract: 将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final: 将一个类生命为最终(即非继承类) ...
- 网站开发进阶(四十二)巧用clear:both
网站开发进阶(四十二)巧用clear:both 前言 我们在制作网页中用div+css或者称xhtml+css都会遇到一些很诡异的情况,明明布局正确,但是整个画面却混乱起来了,有时候在IE6下看的很正 ...
- Java进阶(四十二)Java中多线程使用匿名内部类的方式进行创建3种方式
Java中多线程使用匿名内部类的方式进行创建3种方式 package cn.edu.ujn.demo; // 匿名内部类的格式: public class ThreadDemo { public st ...
- AngularJS进阶(三十二)书海拾贝之特殊的ng-src和ng-href
书海拾贝之特殊的ng-src和ng-href 在说明这两个指令的特殊之前,需要先了解一下ng的启动及执行过程,如下: 1) 浏览器加载静态HTML文件并解析为DOM: 2) 浏览器加载angular. ...
- AngularJS进阶(三十四)Angular数据更新不及时问题探讨
Angular数据更新不及时问题探讨 前言 在修复控制角标正确变化过程中,发觉前端代码组织层次出现了严重问题.传递和共享数据时自己使用的是rootScope,为此造成了全局变量空间的污染.根据< ...
- AngularJS进阶(二十四)AngularJS与单选框及多选框的双向动态绑定
AngularJS与单选框及多选框的双向动态绑定 赠人玫瑰,手留余香.若您感觉此篇博文对您有用,请花费2秒时间点个赞,您的鼓励是我不断前进的动力,共勉! AngularJS 在 <in ...
- AngularJS进阶(二十五)requirejs + angular + angular-route 浅谈HTML5单页面架构
requirejs + angular + angular-route 浅谈HTML5单页面架构 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又 ...
- AngularJS进阶(三十六)AngularJS项目开发技巧之利用Service&Promise&Resolve解决图片预加载问题(后记)
AngularJS项目开发技巧之利用Service&Promise&Resolve解决图片预加载问题(后记) 前言 在"AngularJS项目开发技巧之图片预加载" ...
随机推荐
- IBM-x3650做RAID5更换硬盘后rebuild步骤分享
1.按Ctrl+H进入WebBIOS配置 2.点击start 3.点击Drives,对slot5进行配置 4.选择slot5,选择Properties,点击Go按钮 5.选择MakeUnconfGoo ...
- linux上安装fastdfs+nginx+ngin-module实践并解决多个异常篇
为什么选择Nginx Nginx 是一个很牛的高性能Web和反向代理服务器, 它具有有很多非常优越的特性: 在高连接并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主 ...
- Sublime Text3时间戳查看转换插件的开发
平常配置表中,经常需要用到时间配置,比如活动开始结束.从可读性上,我们喜欢2017-04-27 17:00:00,从程序角度,我们喜欢用1493283600.前者是包含时区概念的,而后者市区无关,所以 ...
- python中删除某个元素的3种方法
python中关于删除list中的某个元素,一般有三种方法:remove.pop.del 1.remove: 删除单个元素,删除首个符合条件的元素,按值删除 举例说明: >>> st ...
- ABP文档笔记 - 通知
基础概念 两种通知发送方式 直接发送给目标用户 用户订阅某类通知,发送这类通知时直接分发给它们. 两种通知类型 一般通知:任意的通知类型 "如果一个用户发送一个好友请求,那么通知我" ...
- 关于go语言的通道
1.记一次gorountine导致的泄漏 在项目中使用https://github.com/deckarep/golang-set这个三方包造成了gorountine泄漏.先来看一下这个包的迭代器设置 ...
- Node.js 逐行读取
逐行读取 稳定性: 2 - 不稳定 使用 require('readline'),可以使用这个模块.逐行读取(Readline)可以逐行读取流(比如process.stdin) 一旦你开启了这个模块, ...
- Angular2学习笔记2
每个angular2应用程序默认使用app目录来创建(可以自己制定,但是eclipse插件生成的会自动使用app) 每个程序应当至少有一个angular模块即根模块.根模块使用@NgModule({} ...
- Maven简介(Maven是什么)
简介 Maven,在意第绪语中意为对知识的积累.Maven最初用来在Jakarta Turbine项目中简化该项目的构建过程.Jakarta Trubine项目有多个工程,每个工程都有自己的多个Ant ...
- RxJava(五) onErrorResumeNext操作符实现app与服务器间token机制
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/51533586 本文出自:[余志强的博客] 一.需求场景: 在开发Ap ...