AngularJS 服务 demo

我们知道Angular提供的标准服务组件有以下:

  • $http:用于处理 XMLHttpRequest
  • $location:提供当前URL的信息
  • $q: 异步请求使用,promise/deferred模块
  • $routeProvider:配置路由
  • $log:日志服务

$http有下面短方法:$http.get() $http.head() $http.post() $http.put() $http.delete() $http.jsonp()

 

$的命名约定

前缀$是表示 Angular自己提供的服务名称,如$scope或$provide等,为了防止冲突,最好避免命名自己开发的服务以为$开头。

如果你检查一个scope内部,你也可能会发现一些属性开头也是以 $开头。这些特性被认为是私有的,并且不应该访问或修改。

下面这个代码是将$window注入到自己的服务中:

Java代码  

  1. angular.module('myModule', [], function($provide) {  
  2.   $provide.factory('notify', ['$window', function(win) {  
  3.     var msgs = [];  
  4.     return function(msg) {  
  5.       msgs.push(msg);  
  6.       if (msgs.length == 3) {  
  7.         win.alert(msgs.join("\n"));  
  8.         msgs = [];  
  9.       }  
  10.     };  
  11.   }]);  
  12. });  

这是一个通知服务,将消息发送到所有Angular提供的window窗口中显示。

要注意的是所有AngularJS服务都是单例的。这意味着在每一个注入器中都只有一个需要的服务的实例。因为AngularJS极度讨厌全局的东西,这是符合面向对象OO。

 

$resource服务与REST

在我们看怎样用 ngResource 方法创建一个 resource 资源之前,我们先看一下怎样用基本的$http 服务做类似的事情.比如我们的信用卡 resource,我们想能够读取、查询、保存信用卡信息,另外还要能为信用卡还款.这儿是上述需求一个可能的实现:

Java代码  

  1. myAppModule.factory('CreditCard', ['$http', function($http) {  
  2.     var baseUrl = '/user/123/card';  
  3.     return {  
  4.        get: function(cardId) {  
  5.            return $http.get(baseUrl + '/' + cardId);  
  6.        },  
  7.        save: function(card) {  
  8.            var url = card.id ? baseUrl + '/' + card.id : baseUrl;  
  9.            return $http.post(url, card);  
  10.        },  
  11.        query: function() {  
  12.            return $http.get(baseUrl);  
  13.        },  
  14.        charge: function(card) {  
  15.            return $http.post(baseUrl + '/' + card.id, card, {params: {charge:true}});   
  16.        }  
  17.     };   
  18. }]);  

$resource是一个依赖$Http的服务组件,它创建了一个资源对象,让你与RESTful服务器端数据源实现交互的工厂。返回的是资源对象,提供了高层次的行为,而不需要与低级别$ HTTP服务交互操作方法。需要ngResource 安装(<script src="lib/angular/angular-resource.js"></script>)。

对返回的数据进行默认的如下操作:

Java代码  

  1. {   
  2. 'get': {method:'GET'},  
  3. 'save': {method:'POST'},  
  4. 'query': {method:'GET', isArray:true},  
  5. 'remove': {method:'DELETE'},  
  6. 'delete': {method:'DELETE'}   
  7. };  

例如:

Java代码  

  1. var User = $resource('/user/:userId', {userId:'@id'});  
  2. var user = User.get({userId:123}, function() {  
  3. user.abc = true;  
  4. user.$save();   
  5. });  

User定义为资源$resource类型,小写的user是其一个实例,实际是从服务器抓取的根据id为123的一个User Json数组,那么我们下面可以对user这个实例使用上面几个默认操作,比如user.$save();。可以轻松地执行CRUD操作(创建,读取,更 新,删除)。

总结为:

 修改

Java代码  

  1. app.factory('itemCategoryService', ['$resource', function($resource) {  
  2.   return $resource(  
  3.     '../systemConfig/updateCategory/:id', {}, {edit: {method: 'put'}}  
  4.   );  
  5. }]);  
  6. var item = new itemCategoryService;  
  7. item.name = $scope.typeData.name;  
  8. item.code = $scope.typeData.code;  
  9. item.$edit({'id': $scope.typeData.id}, function(data) {  
  10.   $location.url('/typeList');  
  11. }, function(error) {  
  12. });  

删除

Java代码  

  1. $resource('../systemConfig/delCategory/:id').remove({'id' : id});  

 

下面以phone举例返回列表:

Java代码  

  1. var phonecatServices = angular.module('phonecatServices', ['ngResource']);  
  2.    
  3. phonecatServices.factory('Phone', ['$resource',  
  4.   function($resource){  
  5.     return $resource('phones/:phoneId.json', {}, {  
  6.       query: {method:'GET', params:{phoneId:'phones'}, isArray:true}  
  7.     });  
  8.   }]);  

这是从后台返回phone列表的$resource用法。节省了$http之类转换。

 

AngularJS提供了一个内置Service $q,它提供了一种承诺/延后(promise/deferred),可以保证我们的调用代码一定能够拿到数据。当然,我们可以猜到,最后去服务器取数据 的方式肯定是异步的。只不过这个服务提供了表面上是同步访问的API,当数据获取成功之后,自动将数据提供给调用的代码。

1. 创建一个Service,去服务器读取数据:

Java代码  

  1. // $q 是内置服务,所以可以直接使用  
  2. ngApp.factory('UserInfo', ['$http', '$q', function ($http, $q) {  
  3.   return {  
  4.     query : function() {  
  5.       var deferred = $q.defer(); // 声明延后执行,表示要去监控后面的执行  
  6.       $http({method: 'GET', url: 'scripts/mine.json'}).  
  7.       success(function(data, status, headers, config) {  
  8.         deferred.resolve(data);  // 声明执行成功,即http请求数据成功,可以返回数据了  
  9.       }).  
  10.       error(function(data, status, headers, config) {  
  11.         deferred.reject(data);   // 声明执行失败,即服务器返回错误  
  12.       });  
  13.       return deferred.promise;   // 返回承诺,这里并不是最终数据,而是访问最终数据的API  
  14.     } // end query  
  15.   };  
  16. }]);  

 2. 在Controller上(以同步方式)使用这个Service:赋值

Java代码  

  1. angular.module('ngApp')  
  2.   .controller('MainCtrl', ['$scope', 'UserInfo', function ($scope, UserInfo) { // 引用我们定义的UserInfo服务  
  3.     var promise = UserInfo.query(); // 同步调用,获得承诺接口  
  4.     promise.then(function(data) {  // 调用承诺API获取数据 .resolve  
  5.         $scope.user = data;  
  6.     }, function(data) {  // 处理错误 .reject  
  7.         $scope.user = {error: '用户不存在!'};  
  8.     });  
  9.   }]);  

 欢迎讨论和交流AngularJS及前端开发

时间: 2024-08-30 17:02:44

AngularJS 服务 demo的相关文章

AngularJS服务总结

在之前介绍AngularJS的博客中,简单的介绍了AngularJS提供的常用服务,以及如何自定义服务,具体可参见<AngularJS 服务(Service)>.在这一篇博客中,我将为大家详细介绍如何自定义服务,以及各种方式之间的区别. value(name, object) value(name, object)方法允许我们直接将一个普通值或对象作为服务.我们通过一段代码来看看如何使用: <!DOCTYPE html> <html> <head> <

AngularJS 服务(Service)

在 AngularJS 中,服务是一个函数或对象,可在我们的 AngularJS 应用中使用.AngularJS 内建了30 多个服务.这一篇博客将为大家介绍一些服务的使用方式以及如何创建我们自己的服务. AngularJS服务的API可以点击这里查看 $http $http 是 AngularJS 应用中最常用的服务. 服务向服务器发送请求,应用响应服务器传送过来的数据.可以理解成jQuery中的ajax. 首先我们创建一个JSON数据文件,用于$http访问. [1,2,3,4,5,6,7,

AngularJS服务service用法总结_AngularJS

本文实例总结了AngularJS服务service用法.分享给大家供大家参考,具体如下: 引言 最近在项目中用到了关于AngularJS中的服务相关的知识,在起初学习这个东西的时候就了解到这个东西在项目中是经常被用到的,在angular中也是比较重要的一块,所以今天小编就总结一些关于service的知识. 认识Service 关于service我们一点都不陌生,不论实在c#中还是Java中我们经常会遇到service的概念,其实service的作用就是对外提供某种特定的功能,也就是我们经常说的"

AngularJS 服务详细讲解及示例代码_AngularJS

AngularJS支持使用服务的体系结构"关注点分离"的概念.服务是JavaScript函数,并负责只做一个特定的任务.这也使得他们即维护和测试的单独实体.控制器,过滤器可以调用它们作为需求的基础.服务使用AngularJS的依赖注入机制注入正常. AngularJS提供例如许多内在的服务,如:$http, $route, $window, $location等.每个服务负责例如一个特定的任务,$http是用来创建AJAX调用,以获得服务器的数据. $route用来定义路由信息等.内置

前端MVC学习总结(三)——AngularJS服务、路由、内置API、jQueryLite

一.服务 AngularJS功能最基本的组件之一是服务(Service).服务为你的应用提供基于任务的功能.服务可以被视为重复使用的执行一个或多个相关任务的代码块. AngularJS服务是单例对象,这意味着只有一个实例被创建过,服务使用AngularJS的依赖注入机制来定义和注册. 可以把服务注入模块.控制器和其它服务. 1.1.内置服务 常见的内置服务如下: $http 发送http请求 $resource 创建一个可以RESTful服务器端数据源交互对象 $window 浏览器的windo

AngularJS入门教程之服务(Service)_AngularJS

AngularJS 服务(Service) AngularJS 中你可以创建自己的服务,或使用内建服务. 什么是服务? 在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用. AngularJS 内建了30 多个服务. 有个 $location 服务,它可以返回当前页面的 URL 地址. 实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &

AngularJS 中文资料+工具+库+Demo 大搜集

中文学习资料: 中文资料且成系统的就这么多,优酷上有个中文视频. http://www.cnblogs.com/lcllao/archive/2012/10/18/2728787.html   翻译的官方的Guide http://www.ituring.com.cn/minibook/303  翻译的官方的tutorial http://www.lovelucy.info/angularjs-best-practices.html  Angular最佳实践 http://zouyesheng.

《AngularJS高级程序设计》——5.5 使用变量及类型

5.5 使用变量及类型 在前面的例子中你看到了如何定义变量:你用var关键字,然后可选地在语句中为变量赋值.在函数中定义的变量是本地变量,适合仅在函数内使用.直接定义在script元素中的变量是全局变量,可在任意位置访问,包括同一HTML文档中的其他脚本.清单5-8演示了本地和全局变量的使用. 清单5-8 在文件jsdemo.html中使用本地和全局变量 JavaScript是动态类型语言.这并不说明JavaScript没有类型.它只是说你并非一定要显式声明变量类型,你可以轻而易举地为同一变量赋

调试Fedex的Demo的异常

问题描述 调试Fedex官网下下来的跟踪服务Demo,把相关参数替换后,运行报下面的异常,请教有做过Fedex对接的高手指点一下异常信息:无法生成临时类(result=1).errorCS0029:无法将类型"TrackWebServiceClient.TrackServiceWebReference.EMailNotificationEventType"隐式转换为"TrackWebServiceClient.TrackServiceWebReference.EMailNot