Angular服务是一个由服务工厂创建的单例对象。这些服务工厂是由 service provider 依次创建的。而service providers是构造函数。它们必须包含一个$get属性用于在实例化的时候返回服务工厂。

当你请求一个服务,$injector负责找到正确的service provider,然后将它实例化得到service factory,并调用service factory的 $get 方法来得到服务的实例。

  • provider(provider) - 使用$injector来注册一个 service provider 。
  • constant(obj) - 注册一个只有providers 和 services 可以访问的 值或对象。
  • value(obj) - 注册一个只有services 可以访问的 值或对象。
  • factory(fn) - 注册一个 service factory 方法,该方法被包裹在 provider 对象当中,并通过 $get 属性来返回这个 factory 方法。
  • service(class) - 注册一个构造方法,它是一个被包裹在 service provider 对象中的类,然后通过 $get 属性来使用该构造方法实例化一个新的对象。

provider(name, provider);

参数 类型 详细
name string

实例(也就是service factory)名称。记住:它的 provider 需要通过 name + 'Provider' 来访问。

provider Object/function()

如果这个 provider 是:

  • 对象: 那么它应该有一个 $get 方法。 这个 $get 方法会在一个实例需要被创建的时候使用$injector.invoke() 来调用。
  • 构造函数: 那么它会使用 $injector.instantiate() 来创建一个provider 的实例,并以对象的形式返回。

factory(name, $getFn);

注册一个service factory,它用于返回一个service 的实例。这是一个注册service factory的简单的写法,因为它的provider 仅仅包含一个 $get 属性。如果你不需要在provider中配置你的 service ,那你可以使用它。

参数 类型 详细
name string

实例的名称

$getFn function()

创建实例的$get方法。 本质来说这是一个$provide.provider(name, {$get: $getFn})的简写法。

service(name, constructor);

注册一个构造方法, 它会通过new方法来创建service实例。 这也是一个$provide.provider(name, {$get: $getFn})的简写法,但这里$getFn是一个构造函数,然后通过new来返回服务的实例。

如果你将你的服务定义为一个type或class,你应该使用$provide.service(class)。

value(name, value);

通过 $injector 注册一个value service,它可以是一个字符串、数值、数组、对象或者方法。该值实际上也是通过它的provider的$get属性,一个没有参数的方法来返回的value service。

它跟constant services很像,但不同点在于他们不能被注入到模块的配置方法中。

AngularJS服务中serivce,factory,provider的区别的更多相关文章

  1. AngularJS 1.x系列:AngularJS服务-Service、Factory、Provider、Value及Constant(5)

    1. AngularJS服务 AngularJS可注入类型包括:Service.Factory.Provider.Value及Constant. 2. Service AngularJS Servic ...

  2. angularJS 服务-$provide里factory、service方法

    当你初试 Angular 时,很自然地就会往 controller 和 scope 里堆满不必要的逻辑.一定要早点意识到,controller 这一层应该很薄:也就是说,应用里大部分的业务逻辑和持久化 ...

  3. AngularJS服务

    在使用AngularJS的路由管理和控制视图加载的时候,当新的视图加载进来,原有视图的控制器会被销毁,这是出于内存占用和性能的考虑.服务提供了一种能在应用的整个生命周期内保持和共享数据的方法,它能够在 ...

  4. AngularJS 1.x系列:AngularJS服务-Service

    1. AngularJS服务 AngularJS可注入类型包括:Service.Factory.Provider.Value及Constant. 2. Service AngularJS Servic ...

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

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

  6. AngularJS中的Provider们:Service和Factory等的区别

    引言 看了很多文章可能还是不太说得出AngularJS中的几个创建供应商(provider)的方法(factory(),service(),provider())到底有啥区别,啥时候该用啥,之前一直傻 ...

  7. AngularJS 中的 factory、 service 和 provider区别,简单易懂

    转自:http://blog.csdn.net/ywl570717586/article/details/51306176 初学 AngularJS 时, 肯定会对其提供 factory . serv ...

  8. [译]AngularJS中几种Providers(Factory, Service, Provider)的区别

    原文: http://blog.xebia.com/2013/09/01/differences-between-providers-in-angularjs/ 什么是Provider? Angula ...

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

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

随机推荐

  1. WordPress 常用数据库SQL查询语句大全

    在使用WordPress的过程中,我们少不了要对数据库进行修改操作,比如,更换域名.修改附件目录.批量修改文章内容等等.这个时候,使用SQL查询语句可以大大简化我们的工作量. 关于如何操作SQL查询语 ...

  2. shell将输入的参数逆序

    #! /usr/bin/ksh count=$#  //总共输入参数 cmd="echo" while [[ $count -gt 0 ]] do cmd="$cmd \ ...

  3. 利用Spring中的HtmlUtils.htmlEscape(input)过滤html

    fatherModule.setModuelName(HtmlUtils.htmlEscape(fatherModule.getModuelName())); log.info(HtmlUtils.h ...

  4. 【poj1745】 Divisibility

    http://poj.org/problem?id=1745 (题目链接) 题意 给出n串数,可以在其两两之间添加+或-,判断是否存在某种方案使得出的表达式的答案可以整除k. Solution 水题一 ...

  5. 新建maven项目

    1.新建maven project 注意:勾上create a new simple project 2.填写相关信息, Grounp id为大项目名字,Artifact id为小项目的名字.注意:P ...

  6. Java虚拟机类加载机制

    看到这个题目,很多人会觉得我写我的java代码,至于类,JVM爱怎么加载就怎么加载,博主有很长一段时间也是这么认为的.随着编程经验的日积月累,越来越感觉到了解虚拟机相关要领的重要性.闲话不多说,老规矩 ...

  7. Linux中vi编辑器的用法

    实验一: vi编辑器的模式切换 1.       实验目标:熟练掌握vi编辑器的三种模式间切换及其特点 2.       实验操作步骤: 步骤一: 进入vi编辑器即命令模式 进入vi编辑器可以在命令终 ...

  8. Hibernate动态更新

    Hibernate一级缓存: Hibernate有一级和二级缓存.一级缓存就是Session. 在Hibernate启动的时候,SessionFactory解析映射文件的时候,会根据映射文件中的字段生 ...

  9. event.keycode值大全

    window.event.keycode-获取按下的键盘值   event.keycode值大全1 keycode 8 = BackSpace BackSpace 2 keycode 9 = Tab ...

  10. chrome 阻止跨域操作的解决方法 --disable-web-security

    做chrome插件时,遇到https页面上请求htttp页面资源时被blocked的问题,初苦寻解决方法未果,最后找到: 给chrome加上 --disable-web-security 参数