在AngularJS中,系统内置的服务都是以$开头,所以我们的自定义服务尽量避免以$开头。自定义服务的方式有如下几种:

  • 使用Module的provider方法
  • 使用Module的factory方法
  • 使用Module的service方法

使用provider方法

app.provider('myProvider', function () {
this.$get = function () {
//do somthing
};
});

通过provider方法创建的服务一定要包含$get方法,provider注入的结果就是$get方法返回的结果,如果不包含$get方法,则程序会报错。

在三种创建服务的方法中,只有使用provider方法创建的服务才可以传进config函数,以用于在对象启用之前,对模块进行配置。但是在config中进行配置的只能是在$get函数之外定义的变量,在下面定义的provider中只有artist与thingFromConfig两个变量可以被访问到,而getArtist与getThingFromConfig两个方法是不能被在config函数中访问到的。

而且在注入config函数中时,参数名必须由服务名+Provider组成,例如下面的例子注入到config函数中的就是myProviderProvider

app.controller('myCtrl', ['$scope', 'myProvider', function ($scope, myProvider) {
console.log(myProvider.getThingFromConfig()); //kingx name
}]); app.provider('myProvider', function () {
this.artist = '';
this.thingFromConfig = ''; this.$get = function () {
var that = this;
return {
getArtist: function () {
return that.artist;
},
getThingFromConfig: function () {
return that.thingFromConfig;
}
}
};
}); app.config(function (myProviderProvider) { //注意这里参数的名字
myProviderProvider.thingFromConfig = 'kingx name';
});

使用provider方法  

app.factory('myFactory', function ($http) {
//不一定是要对象类型,实际为任意类型
var factory = {};
return factory;
});

通过factory方法创建的服务必须有返回值,即必须有return函数,它可以返回任意类型的值,包括基本数据类型或者对象类型。如果没有return函数,则会报错。

factory注入的结果就是return返回的结果,可以在被注入的对象中使用注入的结果定义的各种方法.

 app.controller('myCtrl', ['$scope', 'myFactory', function ($scope, myFactory) {
console.log(myFactory.getName()); //foo
//请求当前文件夹下的test.html
myFactory.getData('./test.html').then(function (response) {
console.log(response); //返回test.html的字符串形式
});
}]); /**------------ 使用factory方法 -----------------*/
app.factory('myFactory', function ($http) {
var factory = {};
var _name = 'foo';
//模仿ajax请求
factory.getData = function (url) {
return $http({
method: 'get',
url: url
});
}; factory.getName = function () {
return _name;
}; return factory; //这里返回的是factory 包含2个方法
});

使用service方法  

通过service方法创建的服务,可以不用返回任何值,因为service方法本身返回一个构造器,系统会用new关键字来创建一个对象,所以我们可以在service内部使用this关键字,对service进行扩展。

 app.controller('myCtrl', ['$scope', 'myService', function ($scope, myService) {
console.log(myService);
myService.setName('foo');
console.log(myService.getName());
}]); /**------------ 使用service方法 -----------------*/
app.service('myService', function () {
this._name = ''; this.getName = function () {
return this._name;
}; this.setName = function (name) {
this._name = name;
}; });

如果使用具有返回值的写法,返回的值必须是一个对象,如果只返回基本类型,则实际返回的还是相当于this

 app.service('myService', function () {
var obj = {};
this._name = ''; obj.getName = function () {
return this._name;
}; obj.setName = function (name) {
this._name = name;
};
return obj;
});

三种方法的比较

  • 需要在config中进行全局配置的话,只能选择provider方法
  • factory和service是使用比较频繁的创建服务的方法。他们之间的唯一区别是:service方法用于注入的结果通常是new出来的对象,factory方法注入的结果通常是一系列的functions
  • provider是创建服务最为复杂的方法,除非你需要创建一个可以复用的代码段并且需要进行全局配置,才需要使用provider创建
  • 所有具有特定性目的的对象都是通过factory方法去创建

 

angularJs自定义服务的更多相关文章

  1. angularjs 自定义服务的三种方式

    angularjs 中可通过三种($provider,$factory,$service)方式自定义服务,以下是不同的实现形式: // 定义module , module中注入$providevar ...

  2. angularJs自定义服务(实现签名和加密)

    写在前面: angularJS是google公司主推的js开发优秀框架... 页面展示: 在应用中进行加密是普遍存在的,个人建议在前端实现加密签名(前端加密是否必要来自知乎:http://www.zh ...

  3. 深究AngularJS——自定义服务详解(factory、service、provider)

    前言 3种创建自定义服务的方式.  Factory Service Provider 大家应该知道,AngularJS是后台人员在工作之余发明的,他主要应用了后台早就存在的分层思想.所以我们得了解下分 ...

  4. angularJs 自定义服务 provide 与 factory 的区别

    <!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...

  5. angularjs 自定义服务(serive,factory,provder) 以及三者的区别

    1.Serive 服务:通过service方式创建自定义服务,相当于new的一个对象:var s = new myService();,只要把属性和方法添加到this上才可以在controller里调 ...

  6. angularjs 自定义服务

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  7. 42.angularJS自定义服务

    转自:https://www.cnblogs.com/best/tag/Angular/ 1. 你可以创建自定义服务,链接到你的模块中: <!DOCTYPE html> <html& ...

  8. angularJS自定义服务的几种方式

    在angularJS中定义服务共有四种常见的方式:factory,service,provider,constant,value 使用形式的不同: 1)factory以返回对象的形式定义服务: mya ...

  9. angularJS——自定义服务provider之$get

    可以认为provider有三个部分: 第一部分是私有变量和私有函数,这些变量和函数会在以后被修改. 第二部分是在app.config函数里可以访问的变量和函数,所以,他们可以在其他地方使用之前被修改. ...

随机推荐

  1. ios app 提交评审注意事项

    在网络上看到的一个文档是这样写,原文的出处无法确认了 基本要点 ·         不能导致手机故障(比如崩溃或屏幕问题) ·         长时间/过度使用之后反应仍然很快 ·         应 ...

  2. 记一次苦逼的SQL查询优化

    最近在维护公司项目时,需要加载某页面,总共加载也就4000多条数据,竟然需要35秒钟,要是数据增长到40000条,我估计好几分钟都搞不定.卧槽,要我是用户的话估计受不了,趁闲着没事,就想把它优化一下, ...

  3. Nginx 301重定向的配置

    301重定向是很常见的需求,比如访问 fz1688.com,自动跳到 www.fz1688.com.或者倒过来,访问 www.fz1688.com 跳到 fz1688.com.Nginx 中配置 30 ...

  4. LeetCode: Lowest Common Ancestor of a Binary Search Tree 解题报告

    https://leetcode.com/submissions/detail/32662938/ Given a binary search tree (BST), find the lowest ...

  5. 解决yum错误:Cannot retrieve repository metadata (repomd.xml) for repository

    解决方法如下: # cd /etc/ #ls 找到yum.repos.d这个目录,里面有个文件CentOS-Media.repo(你的机器里也许不是这个名字,名称应该是自定义的),vi 编译一下里面的 ...

  6. 【Cocos2d-Js基础教学(7)界面UI更新方法(会用到第三方类库)】

    我们游戏中会遇到很多UI更新的时候,大部分时候我们会remove该节点,再重新绘制的方法来进行UI更新. 但是这种更新效率并不高,这里我推荐大家一个第三方的库,来通过注册更新的方式来对UI进行更新管理 ...

  7. 【原】Jqxgrid在Java服务器端分页

    研究这个后台分页一天多,特此写个文章记录备忘 jsp页面中有两个需要注意的地方:一个是source中beforeprocessing,另一个是rendergridrows中数据的获取. 说明:grid ...

  8. ubuntu-15.10-server-i386.iso 安装 Oracle 11gR2 数据库

    注意: ld的版本为 2.25.1,gcc版本为gcc-5 特点: 需要重新安装老版本的 libaio1_0.3.109-2ubuntu?_i386.deb.默认的libaio库有问题,和其默认lib ...

  9. Android Studio] Gradle项目中添加JNI生成文件(.so文件)

    转:http://blog.csdn.net/qiujuer/article/details/24209457 为了适应潮流使用Android Studio还是有半年多了! 对于从Eclipse迁移项 ...

  10. lua中得栈

    如果你看了LUA的文档,那么就应该很清楚LUA与C交互数据时都是用到LUA中所谓的stack.那么当我调用lua_open函数之后栈是什么样的呢?空的(luaopen_base等会往栈上加进一些东西) ...