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. A Country on Wheels【车轮上的国家】

    A Country on Wheels As cultural symbols go, the American  car is quite young. 作为文化象征的美国汽车还相当年轻. The ...

  2. Skyscrapers Covered in Solar Pancels【太阳能电池板覆盖的摩天大楼】

    Skyscrapers Covered in Solar Panels An office tower on Miller Stree in Manchester is completely cove ...

  3. 裸机——210SD卡启动

    1.通过阅读iROM_Application_note可以获取关于启动的全部信息 2.记录下代码 制作SD卡启动的代码,即添加校验和的 #include <strings.h> #incl ...

  4. scala初体验-02

    上一节,我们讲了scala的安装的即一些初步方法,今天,我们来介绍一下scala里面的一些基本操作 1.对于map的的编写,这个是广泛用于Array里面的 val arr = Array(1,2,3, ...

  5. HDFS HA 的 core-site.xml

    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licens ...

  6. 利用js实现倒计时

    倒计时 这个名词并不陌生,比如:天猫,京东等一些网上商城都会推出一些限时特价商品,今天我们就一起编写一个属于自己的倒计时: Ps: 首先做一件事情的时候,不应该盲目的去做,应该首当其冲的去想,脑子里面 ...

  7. laravel5.5服务提供器

    目录 1. 编写服务提供器 1.1 注册方法 register 1.1.1 简单绑定 1.1.2 绑定单例 1.1.3 绑定实例 1.1.4 绑定初始数据 1.2 引导方法 boot 2. 注册服务提 ...

  8. 《Cracking the Coding Interview》——第2章:链表——题目2

    2014-03-18 02:24 题目:给定一个单链表,找出倒数第K个节点. 解法:让一个指针先走K步,然后俩指针一起走到尽头.当然也可以先走到尽头数出链表的长度,然后第二次少走K步.其实耗费的工夫是 ...

  9. 【Spiral Matrix】cpp

    题目: Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spira ...

  10. SpringMVC 整合 kaptcha(验证码功能)

    一.添加依赖 <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptch ...