AngularJS开发指南28:创建服务
来源:互联网 发布:php 文件名截断 编辑:程序博客网 时间:2024/06/05 10:18
虽然AngularJS提过了很多有用的服务,但是如果你要创建一个很棒的应用,你可能还是要写自己的服务。你可以通过在模块中注册一个服务工场函数,或者通过Modeul#factory api或者直接通过模块配置函数中的$provide api来实现。
所有的服务都符合依赖注入的原则。它们用一个唯一的名字将自己注册进AngularJS的依赖注入系统(injector),并且声明需要提供给工场函数的依赖。它们的依赖在测试中可以是虚拟的,这使得它们能很好地被测试。formatDate
注册服务
要注册服务,你首先要有一个包含该服务的模块。然后你就能通过模块的api或者使用模块配置函数中的$provide服务来注册你的服务了。下面的伪代码显示了这两种方法。
使用angular.Module api:
var myModule = angular.module('myModule', []);myModule.factory('serviceId', function() { var shinyNewServiceInstance; //factory function body that constructs shinyNewServiceInstance return shinyNewServiceInstance;});
使用$provide服务:
angular.module('myModule', [], function($provide) { $provide.factory('serviceId', function() { var shinyNewServiceInstance; //factory function body that constructs shinyNewServiceInstance return shinyNewServiceInstance; });});
注意,你不应该注册一个服务实例,而是一个会在被调用时创建实例的工场函数。
依赖
服务不仅可以被依赖,还可以有自己的依赖。依赖可以在工场函数的参数中指定。参阅AngularJS的依赖注入系统,和使用依赖的数组表示法和$inject属性来让依赖表示精简化。
下面是一个很简单的服务的例子。这个服务依赖于$window服务(会被当成参数传递给工场函数),并且只是个函数。这个服务的任务是存储所有的通知;在第三个通知以后,服务会用window的alert来输出所有的通知。
angular.module('myModule', [], function($provide) { $provide.factory('notify', ['$window', function(win) { var msgs = []; return function(msg) { msgs.push(msg); if (msgs.length == 3) { win.alert(msgs.join("\n")); msgs = []; } }; }]);});
实例化AngularJS的服务
所有服务都是延迟实例化的。这意味着所有的服务只有在需要时,或者被依赖时才会实例化。换句话说,AngularJS不会实例化服务,除非被要请求了或者被应用直接或间接依赖了。
var mainApp = angular.module("mainApp", []);mainApp.factory('MathService', function() { var factory = {}; factory.multiply = function(a, b) { return a * b; } return factory; }); mainApp.service('CalcService', function(MathService){//创建服务 this.square = function(a) { return MathService.multiply(a,a); } }); mainApp.controller('CalcController', function($scope, CalcService, defaultInput) {//将服务注入到控制器中 $scope.number = defaultInput; $scope.result = CalcService.square($scope.number); $scope.square = function() { $scope.result = CalcService.square($scope.number); } });
作为单例的服务
最好,要注意的是所有AngularJS服务都是单例的。这意味着在每一个注入器中都只有一个需要的服务的实例。因为AngularJS极度讨厌全局的东西,所以是可以创建多个注入器的,并且每个住一起有自己的服务实例。但这种情况很少,除非在测试中,这样的特性才极度重要。
相关主题
- 理解AngularJS服务
- 管理服务以来
- 将服务注入控制器
- 测试AngularJS服务
相关API
- Angular Service API
- AngularJS开发指南28:创建服务
- AngularJS开发指南
- AngularJS开发指南
- AngularJS开发指南
- angularJS开发指南(angularJS developer guide) 之一
- AngularJS开发指南01:AngularJS简介
- AngularJS开发指南24:AngularJS过滤器
- AngularJS开发指南 中文教程
- AngularJS开发指南06:表达式
- AngularJS开发指南 中文教程
- AngularJS开发指南 中文教程
- 前端资源-AngularJS开发指南
- AngularJS开发指南05:指令
- AngularJS开发指南05:指令
- AngularJS开发指南06:表达式
- AngularJS开发指南07:表单
- AngularJS开发指南11:模块
- AngularJS进阶(四十)创建模块、服务
- JAVA写的九图分割器
- 使用apache-jmeter进行压力测试
- dom click
- C和C++中的字符串和数字转换
- 韦东山u-boot、kernel解压缩、打补丁、配置、编译、烧写操作试验
- AngularJS开发指南28:创建服务
- 9、Power Map—应用拾取坐标系统确定经纬度
- AngularJS $http跨域
- Android 获取音视频文件的播放时长
- ASP.NET MVC 多语言配置
- centos 7禁用ipv6
- 原生JavaScript实现的alert弹框
- ZOJ2868【折半】
- Iphone手机页面消除数字、邮箱的颜色