Angular JS工厂vs服务与供应商的例子
我知道这个问题已经被问及已经给出了答案。 但我通过实际的例子学得最好,并且遇到了我没有完全理解的代码。
我指的是Angular Strap,它是一组非常酷的用户交互指令:http://mgcrea.github.io/angular-strap/
我正在查看工具提示功能的代码,并看到作者正在使用提供程序来公开功能。 他是否也可以使用服务或工厂来完成同样的工作? 或者是提供者必需的?
这里是代码的链接:https://github.com/mgcrea/angular-strap/blob/master/src/tooltip/tooltip.js#L28
谢谢
简短回答: 作者选择了Provider以使默认设置为“只读”。 如果代码没有使用Provider,代码仍然可以工作,但提供者更清洁并且更“安全”
Provider
, Service
和Factory
在Angular中都是基本的东西,只是使用不同的API; Provider
可以被认为是“基础”元素,但它们都有相同的最终目的:创建一个角度注射。 这些注射剂中的每一个都有提供蓝图的提供者(Angular寻找$get
方法)以及提供者生成的Singleton实例。 如果您使用Factory
或Service
,Angular在幕后工作,所以您不需要知道所有的细节; 你只会有一个真正无聊的Provider
,只会做基础知识。 但是,如果您自己使用Provider
,则可以在声明中添加其他属性和功能。
您可以将Providers
注入到模块的config()
方法中,该方法在任何单例创建之前运行。 尝试在这里寻找更长的解释。
在AngularStrap中,作者在Provider上放置了一个'defaults'对象。 作者期望你在你的模块的config()
方法中修改这个对象,然后Angular将生成Singleton。 但是, '默认'对象不在Singleton上 ,所以一旦应用程序“运行”,您就不能更改默认值 。 即使您在某处再次注入Provider
并再次更改默认值,Angular也不会重新生成您的Singleton,因此默认值实际上变为'只读'。 这是一个很好的做法,可以防止代码进行不必要的更改,特别是当您有多个人使用相同的代码时,或者您知道其他人将使用您的模块时。
您可能会看到其他代码不能像这样工作......也许另一个应用程序只是使用factory
,并将“默认”对象放在该工厂。 它仍然“有效”,代码看起来很像现在。 然而,因为'默认'会直接在Singleton上, 所以如果有人编写代码, 你的代码可以在任何时候改变这些设置 。 现在,您必须留下意见和文件解释何时更改默认值,何时不更改默认值等等; 对于99%的情况,应用程序运行后默认值永远不需要更改,因此使用Provider
和module.config()
是安全和直接的。
虽然文件是正确的,有特殊情况下使用每个我认为这也是重要的是要回答他们都是一样的事情。
factory
是provider
的专用版本,在某些情况下,让您使用更少的代码完成同样的事情。 service
和value
是factory
特例。 constant
是value
的特例。
这里是一个图像,一目了然地显示你的意思:
提供商工厂的价值和服务是一回事http://www.simplygoodcode.com/wp-content/uploads/2015/11/angularjs-provider-service-factory-highlight.png
您可以在图片所在的博客上获得更多详细信息:http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/
还有另一个关于Stack Overflow的问题,其中有类似的细节:https://stackoverflow.com/a/33805462/984780
根据官方的Angular文档:
有五种配方类型。
最详细的,也是最全面的一个是提供者配方。 其余四种配方类型 - 价值,工厂,服务和常量 - 只是提供者配方之上的语法糖。
所以,实质上,假设您不需要访问某些高级设置,则构建服务和构建提供程序是相同的。 他们继续说:
只有当您想要公开一个必须在应用程序启动之前进行的应用程序范围配置的API时,您应该使用Provider配方。
这里是一个表格:
功能/配方类型
Factory Service Value Constant Provider can have dependencies yes yes no no yes uses type friendly injection no yes yes* yes* no object available in config phase no no no yes yes** can create functions yes yes yes yes yes can create primitives yes no yes yes yes
*以直接使用new运算符进行初始化初始化为代价
**服务对象在配置阶段不可用,但提供者实例是。
链接地址: http://www.djcxy.com/p/77899.html