服务的用途

  • 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性
  • 服务提供了把特定功能相关联的方法集中在一起的接口

如何创建服务

  • angularJS提供了一些内置服务,同时为复杂应用创建我们自己的服务也是很有必要的
  • anguarjs中创建自己的服务是非常容易的,只需要注册这个服务即可。服务被注册后,angularJS编译器就可以引用他,并且在运行时把它当作依赖加载进来

示例:

  1. angular.module('freefedService',[]).factory('ajaxService',['$http','$q',function($http,$q){
  2. var deferred = $q.defer();
  3. return {
  4. ajaxFunc : function(params){
  5. var params = params || {};
  6. $http({
  7. method : params.method || 'post',
  8. url : params.url || '',
  9. data : params. data || {},
  10. responseType : params.type || 'json'
  11. }).success(function(data){
  12. deferred.resolve(data);
  13. }).error(function(reason){
  14. deferred.reject(reason);
  15. });
  16. return deferred.promise()
  17. }
  18. };
  19. }]);

如何使用服务

  • 可以在控制器、指令或另外一个服务中通过依赖声明的方式来使用服务
  1. demo.html
  2.  
  3. <!doctype html>
  4. <html ng-app="freefedApp">
  5. <head>
  6. <title>angular应用demo</title>
  7. <script src="angular.js"></script>
  8. <script src="service.js"></script>
  9. <script src="app.js"></script>
  10. </head>
  11. <body>
  12. <div ng-controller="userCtrl">
  13. <div class="user-center">
  14. <span class="user-icon"><img src="{{vm.user.pic}}" /></span>
  15. <span class="user-name">{{vm.user.name}}</span>
  16. </div>
  17. </div>
  18. </body>
  19. </html>
  1.  
  1. service.js
  2.  
  3. angular.module('freefedService',[]).factory('ajaxService',['$http','$q',function($http,$q){
  4. var deferred = $q.defer();
  5. return {
  6. ajaxFunc : function(params){
  7. var params = params || {};
  8. $http({
  9. method : params.method || 'post',
  10. url : params.url || '',
  11. data : params. data || {},
  12. responseType : params.type || 'json'
  13. }).success(function(data){
  14. deferred.resolve(data);
  15. }).error(function(reason){
  16. deferred.reject(reason);
  17. });
  18. return deferred.promise()
  19. }
  20. };
  21. }]);
  22.  
  23. app.js
  24.  
  25. /*声明module*/
  26. var module = angular.module('freefedApp',['freefedService']);
  27.  
  28. /*声明控制器*/
  29. module.controller('userCtrl',['$scope','ajaxService',function($scope,ajaxService){
  30. var vm = $scope.vm = $scope.vm || {};
  31. vm.user = {};
  32. //调用ajaxService服务
  33. ajaxService.ajaxFunc( {
  34. url : '/getUser.php'
  35. } ).then(function(data){
  36. vm.user.pic= data.pic;
  37. vm.user.name = data.name;
  38. },function(error){
  39. alert( error.msg );
  40. }
  41. );
  42. }])

  1. 多种创建服务方式
  • service

    使用service可以注册一个支持构造函数的服务,它允许我们为服务对象注册一个构造函数,service函数接收两个参数:

    name(字符串)需要注册的服务名

    constructor(函数) 构造函数,调用它来实例化服务对象, 注入到应用中,会生成一个构造函数的实例对象被引用

    1. angular.module('freefedService',[]).service('myService',function(){
    2.  
    3. this.getUser = function(){};
    4.  
    5. });
  • factory

    factory是创建和配置服务的最快捷的方式,相对于service函数,factory更加适用于当你在设计一个需要私有方法或属性的类的时候使用,factory函数接收两个参数:

    name(字符串) 需要注册的服务名

    getFn(函数) 这个函数会在angularJS创建服务时调用

    1. //有私有方法、属性的类示例:
    2. angular.module('freefedService',[]).factory('myService',function(){
    3. var _version = '1.1.0'; //私有属性
    4. var _method = function(){ }; //私有方法
    5.  
    6. return new function(){
    7. this.getVersion= function(){
    8. return _version;
    9. };
    10. this.method = function(){
    11. _method(); //调用私有方法
    12. };
    13. };
    14.  
    15. });
    16.  
    17. //普通示例:
    18. angular.module('freefedService',[]).factory('myService',function(){
    19. return {
    20. getUser : function(){}
    21. };
    22. });
  • provider

    所有服务工厂都是由provider服务创建的,provide服务负责在运行时初始化这些提供者,provider函数接收两个参数:

    name(字符串) 需要注册的服务名

    aProvider(对象、函数)

    • aProvider是函数,那么它会通过依赖注入被调用, 并且通过$get方法返回一个对象
    1. angular.module('freefedService',[]).provider('myService',function(){
    2. this.setUrl = function(){};
    3. this.$get = function( $http ){ //依赖注入在此加入
    4. return {
    5. getUser : function(){}
    6. };
    7. };
    8. });
    • aProvider是对象,要带有$get方法
    1. angular.module('freefedService',[]).provider('myService',{
    2. setUrl : function(){};
    3. $get: function( $http ){ //依赖注入在此加入
    4. return {
    5. getUser : function(){}
    6. };
    7. };
    8. });

    什么场景使用provider方式创建服务

    如果希望在config函数中可以对服务进行配置,必须用provider()来定义服务,示例

    1. demo.html
    2.  
    3. <!doctype html>
    4. <html ng-app="freefedApp">
    5. <head>
    6. <title>angular应用demo</title>
    7. <script src="angular.js"></script>
    8. <script src="service.js"></script>
    9. <script src="app.js"></script>
    10. </head>
    11. <body>
    12. <div ng-controller="userCtrl">
    13. <div class="user-center">
    14. <span class="user-icon"><img src="{{vm.user.pic}}" /></span>
    15. <span class="user-name">{{vm.user.name}}</span>
    16. </div>
    17. </div>
    18. </body>
    19. </html>
    1. service.js
    2.  
    3. angular.module('freefedService',[]).provider('userService',function(){
    4. var baseUrl = 'http://dev.freefed.com'
    5. this.setUrl = function( base ){ baseUrl = base || baseUrl; };
    6. this.$get = function( $http ){ //依赖注入在此加入
    7. return {
    8. getUser : function(){
    9. $http({
    10. url : baseUrl + '/getUser.php'
    11. });
    12. }
    13. };
    14. };
    15. });
    16.  
    17. app.js
    18.  
    19. /*声明module*/
    20. var module = angular.module('freefedApp',['freefedService']).
    21. config('userServiceProvider',['userServiceProvider',function(userServiceProvider){
    22. //当我们希望在应用开始前对service进行配置的时候就需要使用到provider()
    23. userServiceProvider.baseUrl = 'http:://product.freefed.com';
    24. }]);
    25.  
    26. /*声明控制器*/
    27. module.controller('userCtrl',['$scope','userService',function($scope,userService){
    28. var vm = $scope.vm = $scope.vm || {};
    29. vm.user = {};
    30. //调用userService服务
    31. userService. getUser();
    32. }]);
  • constant

    可以将一个已存在的常量值注册为服务,通过注入引用到应用中,constant()接收两个参数:

    name(字符串) 需要注册的常量名

    value(值或对象) 需要注册的常量的值

    1. angular.module('freefedApp',[]).constant('configService',{
    2. //把后台系统所有接口,以及硬编码的文本等都全部提取到这里来统一配置
    3. UPLOAD_ERROR_TIP : '文件上传失败',
    4. UPLOAD_SUCCESS_TIP : '文件上传成功',
    5. ......
    6. BASE_URL : 'http://prodoct.freefed.com/',
    7.  
    8. api : {
    9. login : '/login.php'
    10. user : '/user.php'
    11. .......
    12. }
    13. });
  • value

    如果通过provider的$get返回的是一个常量,那就没必要定义一个包含复杂功能的完成服务,可以直接通过value函数方便的定义一个服务,value()接收两个参数:

    name(字符串) 需要注册的常量名

    value(值或对象) 将这个值作为可注入的实例返回

    1. angular.module('freefedApp',[]).value('my',{
    2. mytext : 'freefed welcome to you',
    3. change : function(){}
    4. });

    value()与constant()的区别

    • 通过constant()声明的常量可以直接注入到配置函数中,通过value()声明的则不行,如下:

      1. //constant()
      2. angular.module('freefedConfig',[]).constant('apikey','kly78hjqp1k3b');
      3. angular.module('freefedApp',['freefedConfig']).config( ['apikey',funciton( apikey ){
      4. var key = apikey; //可以正常访问到常量apikey的值
      5. }] );
      6.  
      7. //value()
      8. angular.module('freefedConfig',[]).value('apikey','kly78hjqp1k3b');
      9. angular.module('freefedApp',['freefedConfig']).value( ['apikey',funciton( apikey ){
      10. //将会抛出错误, 未知的 provider : apikey ,因为在config函数内部无法访问这个值
      11. }] );
    • 通常用value()来注册服务对象,用constant()来配置数据

angularJS中如何写服务的更多相关文章

  1. 【AngularJS中的自定义服务service VS factory VS provider】---它们的区别,你知道么?

    在介绍AngularJS自定义服务之前,我们先来了解一下AngularJS~ 学过HTML的人都知道,HTML是一门很好的伪静态文本展示设计的声明式语言,但是,要构建WEB应用的话它就显得乏力了. 而 ...

  2. AngularJS中实现日志服务

    本篇体验使用AngularJS自定义一个记录日志的服务. 在AngularJS中,服务的一些写法是这样的: var app = angular.module('app',[]); app.provid ...

  3. angularJS中如何写控制器

    angularJS中的控制器是一个函数,用来向视图作用域中添加额外的功能,我们用它来给作用域对象设置初始状态,并添加自定义行为 当我们在页面上创建一个新的控制器时,angularJS会生成并传递一个新 ...

  4. angularJS中如何写自定义指令

    指令定义 对于指令,可以把它简单的理解成在特定DOM元素上运行的函数,指令可以扩展这个元素的功能 例如,ng-click可以让一个元素能够监听click事件,并在接收到事件的时候执行angularJS ...

  5. AngularJS中的http服务的简单用法

    我们可以使用内置的$http服务直接同外部进行通信.$http服务只是简单的封装了浏览器原生的XMLHttpRequest对象. 1.链式调用 $http服务是只能接受一个参数的函数,这个参数是一个对 ...

  6. 自定义AngularJS中的services服务

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  7. AngularJs中的服务

    一.angularJs中的简单服务应用 下面的例子让我们明白在AngularJs中如何去调用文件中的数据,从而将文件中的数据显示在页面上;改变url的地址,也可以去调用后台接口. 实例: <!D ...

  8. AngularJS 中的Promise --- $q服务详解

    先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 什么是Promise 以前了解过 ...

  9. 怎么理解angularjs中的服务?

    AngularJS中的服务其实就是提供一种方式抽取共用类库 比如说一些工具类方法,我们传统的做法就是自己写个 utility 类,把相关的工具方法填充到utility里面去,最后把utility类放到 ...

随机推荐

  1. 网络流(最大流) CQOI 2015 BZOJ 3931 网络吞吐量

    3931: [CQOI2015]网络吞吐量 Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活 动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器 ...

  2. DP(斜率优化):HDU 3507 Print Article

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  3. 从JavaScript的移位运算看数字在计算机内部的编码——补码

    偶然看到一个JavaScript的题目: js中13>>2=?      -13>>2=? 在浏览器中很容易测试出答案分别是 3 和 -4. 13>>2 = 3 很 ...

  4. 动态规划——K背包问题

    Problem DescriptionNow you are asked to measure a dose of medicine with a balance and a number of we ...

  5. Vagrant虚拟机的配置管理

    Vagrant虚拟机的配置管理 一.shell配置管理 二.使用Puppet进行配置管理 三.案例 Apache服务器的自动配置 3.1 shell配置管理 3.2 puppet配置管理 ps:由于最 ...

  6. [经典] 最X(长 | 大和 | 大积)Y(子序列 | 子字符串)

    Note: 子序列,可以不连续:子字符串,必须连续. 以下题目按在我看看来的难度从易到难排列: 最大和子序列(Maximum sum subsequence) 这道题纯属娱乐...应该不会有人出这种题 ...

  7. web前端开发中Nodejs、Grunt、npm等的介绍、使用

    一.Nodejs的安装: Grunt和所有grunt插件都是基于nodejs来运行的,如果你的电脑上没有nodejs,就去安装吧.去 https://nodejs.org/ 上,点击页面中那个绿色.大 ...

  8. HDU 1247

    简单的字典树 - -,求一个单词是否由两个单词组成 #include<iostream> #include<cstring> #include<cstdio> us ...

  9. java中的String.format使用

         format(String  format, Objece...  argues)函数相当于C语言中的printf函数,但是相对来说更灵活.      和C中的printf函数差不多,在fo ...

  10. android scrollview组件禁止滑动的方法

    xml配置:           android:id="@+id/sc_freement"             android:layout_width="fill ...