• AngularJS服务中serivce,factory,provider的区别


    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很像,但不同点在于他们不能被注入到模块的配置方法中。

  • 相关阅读:
    $Noip2011/Luogu1311$ 选择客栈
    $Noip2013/Luogu1970$ 花匠 $dp$+思维
    $CF1063B Labyrinth$ $01$最短路/$01BFS$
    $UVA10559 Blocks $区间$dp$
    $SCOI2009 windy$数 数位$dp$
    $cometoj#4 D $求和 不是$dp$
    Manacher算法总结
    题解 P1537 【弹珠】
    题解 P4609 【[FJOI2016]建筑师】
    字符串专题随笔
  • 原文地址:https://www.cnblogs.com/WhiteCusp/p/4363905.html
Copyright © 2020-2023  润新知