1.首先我们创建一个模块

var module = angular.module( "my.new.module", [] );

2.然后写具体的service 可以看到它是一个很有趣的对象 ,以键值对的方式定义属性和值, 值可能是数组,json对象数组,或者函数

appServices.service('Book',['$rootScope',function($rootScope){

    var service = {
books: [
{title:'bbq',anthor:'李斯'},
{title:'barbecue',anthor:'loli'}
],
addBook: function(a_book){
service.books.push(a_book);
$rootScope.$broadcast( 'books.update' );
//这里相当于定义了一个回调函数,任何调用这个图书服务的指令,控制器,过滤器等可以选择实现这个books.update句柄
来进行addBook后想执行的操作,如更新$scope
}
} return service;
}]);

note:这是通常一个简单的service的写法
    $broadcast只能向child controller传递event与data
    $emit只能向parent controller传递event与data
    $on用于接收event与data

controller之间的层级关系 (controller可以任意嵌套):

<div class="box row" ng-controller="parentCtrl">
<div class="col-xs-12">
<a ng-click="clickMe()" >click me!->i belong parent controller</a>
<div ng-controller="AChildCtrl">
<a ng-click="clickMe()" s>click me!->i belong child&&brother controller</a>
</div>
<div ng-controller="BChildCtrl">
<a ng-click="clickMe()" >click me!->i belong child&&brother controller</a>
</div>
</div>
</div>
$broadcast $emit $on 的应用

appCtrls.controller('parentCtrl',['$scope',function($scope){

     $scope.clickMe = function(){
var book = { title:'monkey' , author:'lee' }
$scope.$broadcast('givetochild',book);
}
}]); appCtrls.controller('AChildCtrl',['$scope',function($scope){ var book = { title:'fifty shadows' , author:'mcdownload' }
$scope.$emit = ('givetoparent', book); //向父级传值
}]); appCtrls.controller('BChildCtrl',['$scope',function($scope){ $scope.$on('givetochild',function(event,data){
console.log(data.title + ' ' + data.author); //输出 mokey 和 lee
console.log(event);
});
}]);

比较奇怪的现象是如果

appCtrls.controller('parentCtrl',['$scope',function($scope){

         var book = { title:'monkey' , author:'lee' }
$scope.$broadcast('givetochild',book);
}]);

那么总是不会触发$on,得不到任何输出
但是如果,总会正常得到值

appCtrls.controller('parentCtrl',['$scope','$timeout',function($scope,$timeout){
$timeout(function(){
var book = { title:'monkey' , author:'lee' }
$scope.$broadcast('givetochild',book);
},);
}]);

service的使用简单代码实例为

template:
<div class="box row" ng-controller="books.list">
<div class="col-xs-12">
<p ng-repeat="book in books">{{book.title}} -- {{book.author}}</p>
<input type="text" ng-model="book_title" placeholder="请输入书名"><br>
<input type="text" ng-model="book_author" placeholder="请输入作者"><br>
<a ng-click="addBook()">添加书籍</a>
</div>
</div> controller:
var appCtrls = angular.module('appCtrls',[]);
appCtrls.controller('books.list',['$scope','Book',function($scope,Book){ $scope.books = Book.books; //取用图书服务 $scope.addBook = function(){
var a_book = { title:$scope.book_title , author:$scope.book_author }
Book.addBook(a_book);
} $scope.$on('books.update',function(event){
$scope.books = Book.books;
}); }]); service:
var appServices = angular.module('appCtrls');
appServices.service('Book',['$rootScope',function($rootScope){ var service = {
books: [
{title:'bbq',author:'李斯'},
{title:'barbecue',author:'loli'}
],
addBook: function(a_book){
service.books.push(a_book);
$rootScope.$broadcast( 'books.update' );
}
} return service;
}]);

此外,$on还暴露了更多我们可以用到的东西,如果你需要的话
在$on的方法中的event事件参数,其对象的属性和方法如下

事件属性                                 目的
event.targetScope 发出或者传播原始事件的作用域
event.currentScope 目前正在处理的事件的作用域
event.name 事件名称
event.stopPropagation() 一个防止事件进一步传播(冒泡/捕获)的函数(这只适用使用`$emit`发出的事件)
event.preventDefault() 这个方法实际上不会做什么事,但是会设置`defaultPrevented`为true。
直到事件监听器的实现者采取行动之前它才会检查`defaultPrevented`的值。 event.defaultPrevented 如果调用了`preventDefault`则为true

angular 十分推崇以模块化的方式组织代码,从而管理数据,处理页面交互等

你可以看到我们总是先 var xxx= angular.module('xxx',[]) (先创建模块),然后你可以试试console.log(xxx);

你可以看到模块下的属性, constant是module的,service是module的,controller是module,filter是module的,animation是module的

它们的值都是一个function,在module启动后,由angularjs框架封装好的getter setter去invoke我们定义的对应的service,controller....

所以使用service来管理数据比控制器注入的scope要好的多,当你要在多个控制器间分享数据时,当任何时候控制器需要某些数据时,你可以使用注入service的方式,得到数据,

更好的是当你要跨域名分享数据时,你显然只需要在根module,或者什么地方的模块定义了service,然后引入这个第三方module的js文件就可以了,

你可能会担心不够clean,但是这完全不是问题,因为还记得angular的依赖注入系统麻,在你的app启动的module定义时加入注入这个module即可,这样这个module可以做得十分clean.

更有意思的一件事情是 service数据来源的方式不是constant或者Value, 通过service你完全使用异步$http之类的来得到数据

所以代码可以这样组织

var appServices = angular.module('appServices',[]);  //这时我们给数据服务单独了一个模块

//然后我们让service 使用$http的方式,而不是直接定义数据
appServices.service('Book',['$rootScope', '$http',function($rootScope,$http){ var service = {
books: [
{title:'bbq',author:'李斯'},{},{},...
],
addBook: function(a_book){ .... },
booksNext: function(){
var req = {
url: 'http://www.baidu.com',
params: {
name: 'lee',
phone:
}
}
$http(req)
.success(function(data,status){
console.log(data);console.log('is success');
})
.error(function(data,status){
console.log(data);console.log('is error');
});
}
} return service;
}]);

然后我们的应用程序启动时这样的结构

//在根module这样
var app = angular.module('app', [
'appCtrls',
'appFilters',
'appDirectives',
'appServices', //这里注入
'infinite-scroll',
'ngRoute',
'ngSanitize',
'ngStorage'
]); //或者在这里注入
var appCtrls = angular.module('appCtrls',['appServices']);

然后在控制器里具体使用(十分简单)

appCtrls.controller('books.list',['$scope','Book',function($scope,Book){

    $scope.books = Book.books;  //取用图书服务
Book.booksNext(); //取用图书列表的下一页
}]);

angularjs的service的更多相关文章

  1. AngularJS:Service

    ylbtech-AngularJS:Service 1.返回顶部 1. AngularJS 服务(Service) AngularJS 中你可以创建自己的服务,或使用内建服务. 什么是服务? 在 An ...

  2. AngularJS 1.x系列:AngularJS服务-Service

    1. AngularJS服务 AngularJS可注入类型包括:Service.Factory.Provider.Value及Constant. 2. Service AngularJS Servic ...

  3. AngularJS之Service(四)

    前言 前面我们讲了控制器.过滤器以及指令,这一节我们来讲讲重大内容之一服务和其中涉及到的工厂. 话题 AngularJS中服务可以说是和DI紧密联系在一起,在应用程序中我们可以通过使用服务来共享代码, ...

  4. AngularJS 服务(Service)

    AngularJS 中你可以创建自己的服务,或使用内建服务. 什么是服务? 在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用. AngularJS 内建了30 ...

  5. Make AngularJS $http service behave like jQuery.ajax()(转)

    There is much confusion among newcomers to AngularJS as to why the $http service shorthand functions ...

  6. angularjs factory,service,provider 自定义服务的不同

    angularjs框架学了有一段时间了,感觉很好用.可以把angularjs的app理解成php的class,controller是控制器,而内置服务和自定义服务就可以理解成models了.angul ...

  7. AngularJS 1.x系列:AngularJS服务-Service、Factory、Provider、Value及Constant(5)

    1. AngularJS服务 AngularJS可注入类型包括:Service.Factory.Provider.Value及Constant. 2. Service AngularJS Servic ...

  8. Angularjs演示Service功能

    在angularjs中,我们可以自定义自己的service.可以说得是自定义的方法,函数. 下面我们一步一步来演示吧:首先为angularjs定义一个app: var demoApp = angula ...

  9. 【angularJS】Service服务

    AngularJS 中的服务是一个函数或对象.可以创建自己的服务,或使用内建服务. 内置服务 AngularJS 内建了30 多个服务. 1.  $location 服务,它可以返回当前页面的 URL ...

随机推荐

  1. selenium破解极限

    一共分为两端段代码: 第一段:获取cookie 第二段:通过cookie登陆 这里以百度云为例: 第一部分:保存cookies,直接在cmd中执行就好 >>> from seleni ...

  2. array_unique() - 去除数组中重复的元素值

      array_unique() 定义和用法 array_unique() 函数移除数组中的重复的值,并返回结果数组. 当几个数组元素的值相等时,只保留第一个元素,其他的元素被删除. 返回的数组中键名 ...

  3. mysql的一些相关的命令(2013-05-05-bd 写的日志迁移

    cmd中连接:mysql -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit (回车) --建立数据库creata database 数据库名;--切换到数据库下工 ...

  4. Python 对象(type/object/class) 作用域 一等函数 (慕课--Python高级,IO并发 第二章)

    在python中一共有两种作用域:全局作用域和函数作用域全局作用域:在全局都有效,全局作用域在程序执行时创建,在程序执行结束时销毁:所有函数以外的区域都是全局作用域:在全局作用域中定义的变量,都属于全 ...

  5. JavaSE 第二次学习随笔(一)

    Java是一种区分大小写的强类型准动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化,类型的检查是在运行时做的,优点为方便阅读,清晰明了,缺点 ...

  6. 嵌入式Linux编译内核步骤 / 重点解决机器码问题 / 三星2451

    嵌入式系统更新内核 1. 前言 手里有一块Friendly ARM的MINI2451的板子,这周试着编译内核,然后更新一下这个板子的Linux内核,想要更新Linux Kernel 4.1版本,但是种 ...

  7. PHP.TP框架下商品项目的优化1-时间插件、鼠标所在行高亮、布局规划页面

    1.优化搜索表单中按时间搜索的功能 添加一个时间插件datetimepicker,在lst.html中,注意要导入jquery.min.js,此处从前文的在线编辑器中导入 <!-- 导入 --& ...

  8. JS是如何计算 1+1=2 的?

    身为程序员多年,作者今天突然对这件事感到十分好奇了.我问计算机芸芸部件,1+1究竟是如何计算的,他们都茫然的看着我. 打开谷歌浏览器->Console面板,大脑向双手不停发送生物电信号,肌肉细胞 ...

  9. Android getLocationInWindow

    参考博客: http://blog.sina.com.cn/s/blog_44d19b500102vpve.html 这篇博客,我看了三遍,终于看懂了.恩,我就喜欢这样不放弃的自己. 1.getLoc ...

  10. ios交叉编译dylib

    ios交叉编译dylib 因多个静态库,libes,libffmpeg,libmt. libpcap 使用不方便 在封装一层接口,生成动态库(c代码),由IOS app上层调用. IOS_BASE_S ...