AngularJS(二)——使用AngularJS自定义service

与 Java 相似, AngularJS 中的 controller 应该尽可能保持短小精悍,不提倡在 controller 中进行 DOM 操作和数据操作。先来看一个臃肿、难以维护的 controller :

var app = angular.module(‘APPModule‘, []);
app.controller(‘MainController‘, function($scope) {
  $scope.shouldShowLogin = true;
  $scope.showLogin = function() {
    $scope.shouldShowLogin =!$scope.shouldShowLogin;
};
$scope.clickButton = function() {
  $(‘#btnspan‘).html(‘Clicked‘);
};
$scope.onLogin = function(user) {
  $http({
    method: ‘POST‘,
    url: ‘/login‘,
    data: {
      user: user
  }
  }).success(function(data) {
    //Some Actions
  });
};
});

coding 初学者总是倾向于写这种代码。更加优雅的方法是通过使用 service 和 directive 使 controller 更轻量,更易于维护。下面来看看如何自定义并使用service 。

1.通过 factory() 创建自定义 service

var app =angular.module(‘APPModule‘, []);
app.factory(‘UserService‘, [
  ‘$http‘,
  function($http) {
    var runLogin = function(user) {
      $http({
        method: ‘POST‘,
     url: ‘/login‘,
     data: {
       user: user
     }
    }).success(function(data) {
      //Some Actions
    });
    };
   
    return {
      runLogin: runLogin
    };
  }
]);

不难发现,如此声明自定义的 service 后,我们将之前臃肿的 controller 中的登录逻辑放到了 UserService 中,代码马上变得逼格十足。

2.使用自定义 service

app.controller(‘MainController‘, [
 ‘$scope‘,
  ‘UserService‘,
  function($scope, UserService) {
    $scope.onLogin = function(user) {
      UserService.runLogin(user);
    };
  }
]);

这里的 UserService就是我们自定义的 service ,在 controller 初始化时注入,即可使用其中的值和方法了。注意一点,在自定义服务之前注入所有的 AngularJS 内置服务,是约定俗称的规则。

如果自定义的service 和使用它的 controller 不在一个 module中,需要在 controller 所在 module 初始化时注入 service 所在的 module:

var serviceModule = angular.module(‘ServiceModule‘, []);
serviceModule.factory(‘UserService‘, [
  ‘$http‘,
  function($http) {
    … //与之前UserService相同
  }
]);
//在controller所在的module中注入service所在的module
var app =angular.module(‘APPModule‘, [‘ServiceModule‘]);
app.controller(‘MainController’, [
  ‘$scope‘,
  ‘UserService‘,
  function($scope, UserService) {
   … //与之前controller相同
  }
]);

3.创建自定义 service 的其他方式:

factory() 方法是用来创建服务的最常规方式,除此之外,还有其他方式可以创建服务。

3.1 provider()

app.provider(‘UserService‘, {
  self: this,
  setName:function(name) {
    self.name = name;
  },
  $get: function() {
    return {
      getName: function() {
        return self.name;
      }
    };
  }
});

使用provider() 创建时,返回的对象中必须有 $get() 函数对象,否则会创建失败。用 provider() 创建服务可以在多个应用使用同一个服务时获得更强的扩展性,通过如下方式进行扩展:

app.config(function(UserServiceProvider) {
  NameServiceProvider.setName(‘Lucy‘);
});

其中,UserServiceProvider为对应的服务名 + Provider组成,通过这一对象可以调用 UserService中的方法。

3.2 constant()

该方法可以将变量值注册为服务,可以使该变量被其他 module 或 controller 共享:

app.constant(‘ASToken‘, ‘12345‘);
app.controller(‘MainController‘, [
  ‘$scope‘,
 ‘ASToken‘, //注入constant
 function($scope, ASToken) {
   //Some Actions
 }
]);

将 constant 注入后就可以直接使用了。

3.3 value():

与 constant()用法相同。与 constant() 的区别是,constant() 可以注入到 config 中,而 value() 不行:

app.constant(‘ASToken‘, ‘12345‘).config(function(ASToken) {
  //正常使用
});
app.constant(‘ASValue’, ‘12345‘).config(function(ASValue) {
  //ASValue在config中无法访问
});

4.AngularJS中的拦截器$provide.decorator()

AngularJS 中的 $provide 服务提供了在服务实例创建时对其进行拦截的功能,可以对服务进行扩展和修改。不仅可以使用在自定义服务上,也可以对AngularJS 的内置服务进行拦截。以拦截 3.1 中 provider() 创建的 UserService 为例:

app.config([
  ‘$provide’,
  function($provide) {
    $provide.decorator(‘UserService‘, [
      ‘$delegate‘,
      function($delegate) {
        return{
          getName: function() {
            return $delegate.getName() + ‘ <-- TheFunction Has Been Decorated.‘
          },
          getAge: function() {
            return 18;
          }
        };
      }
    ]);
  }
]);

如上所示,在 config 中,通过 $provide.decorate() 方法拦截 UserService ,注入的 $delegate 可以调用要拦截的 service 中原本的方法。这里我们通过对UserService 进行拦截,修改了 UserService 中的 getName() 方法,并为 UserService 添加了 getAge() 方法。

完。

参考资料:

《AngularJS 权威教程》作者:Ari Lerner  译者:赵望野 徐飞 何鹏飞

时间: 2024-10-06 07:29:33

AngularJS(二)——使用AngularJS自定义service的相关文章

AngularJs学习笔记5——自定义服务

前面整理了AngularJs双向数据绑定和自定义指令的相关内容,从手册上看也知道,ng部分还包括过滤器和函数,以及服务等. 过滤器:filter,就是对数据进行格式化,注意管道格式,例如: {{表达式 | number/currency/data/orderBy : " 相应的格式或表达式 "}} 函数:function,应该不用介绍了.这里需要注意的是forEach函数的形参顺序,基本格式如下: 1 var obj={name:"fanfan",age:"

AngularJS学习---REST和自定义服务(REST and Custom Services) ngResource step 11

1.切换目录 git checkout step-11 npm start 2.效果图 效果图和step 10的没有什么差别,这里主要的改动都是代码,代码做了很多优化,这里效果图就不再贴出来了. 3.实现代码 step-10和step-11之间的差别:https://github.com/angular/angular-phonecat/compare/step-10...step-11 Dependencies (依赖的JS): { "name": "angular-see

AngularJS进阶(三十三)书海拾贝之简介AngularJS中使用factory和service的方法

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

AngularJS控制器和AngularJS过滤器的学习(3)

前面简单的学习了AngularJS的表达式和指令,就可以说大概对AngularJS有了一定的了解吧,嘿嘿,下面就来总结学习一下AngularJS的控制器和过滤器哦. 说起来AngularJS控制器,其实就是常规的JavaScript对象.来控制AngularJS应用程序的数据. 一.AngularJS的控制器 <1>.AngularJS 控制器 在浏览器中浏览的结果是: AngularJS应用程序被控制器控制,ng-controller指令定义了应用程序控制器,控制器是JavaScript对象

【REACT NATIVE 系列教程之二】创建自定义组件&&导入与使用示例

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2219.html 在上一篇  [REACT NATIVE 系列教程之一]触摸事件的两种形式与四种TOUCHABLE组件详解 中的最后介绍了如何使用Touchable的四种组件进行监听触摸事件.  那么紧接着我们利用Touchable来包装一个带图片的Button组件,且设计成可接受很多自定义参数. 一:创建我们自定义

JBPM学习(二):ProcessEngine与Service API

1.获取processEngine的方法: a) 方法一 private ProcessEngine processEngine = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine(); b) 方法二 // 获取单例的ProcessEngine对象,使用的是默认的配置文件(jbpm.cfg.xml) private ProcessEngine processEngine = Configuration

PHPCMS V9二次开发自定义分页函数的解决方案

下面为大家分享一个PHPCMS V9二次开发自定义分页函数的方法. 方法如下: 首先打开 phpcms\libs\functions\global.func.php这个文件,找到分页函数,复制一下,粘贴到默认分页函数的下面,重新命名,比如我的就命名为wz_pages,保存. 打开 phpcms/libs/classes/template_cache.class.php,找到207行的: $str .= '$pages = pages($'.$op.'_total, $page, $pagesiz

【js类库AngularJs】学习angularJs的指令(包括常见表单验证,隐藏等功能)

[js类库AngularJs]学习angularJs的指令(包括常见表单验证,隐藏等功能) AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核心的 是:MVVM.模块化.自动化双向数据绑定.语义化标签.依赖注入.等等. 参考资料: angularjs中文网:http://www.apjs.net/ angularjs官网:http://angula

Cocos2d-x 3.1.1 学习笔记(二)创建自定义项目

一.通过命令创建项目 前面搭建好环境后,怎样创建自己的cocos2d-x项目呢? 先来看看cocos2dx 3.1的目录吧 这就是 cocos2dx 3.1的目录, 3.1版本的创建跟以前的不同了(好吧,又变了),我们先把 download-deps.py 和 setup.py 执行一遍,按住shift+鼠标右键 输入cocos命令 回车 这里会看到一些命令的声明,这里我只说下 创建新的项目,输入命令cocos new 这里 -p      是包名 -l       是文件格式 有cpp.lua