Javascript 服务是提供者的子集,还是不是?
2015年4月编辑 到目前为止,我得到的答案解释了服务/工厂/和供应商之间的区别,但这并没有真正理解我所困惑的。AngularJS文档断言,这三个代码本质上是“引擎盖下”相同的代码。但如果是这样,为什么我只能将“提供者”传递到配置块中,而不是“工厂” 原始问题: 根据报告: 最详细、也是最全面的一个是提供者 配方其余四种配方类型-价值、工厂、服务和 常量-只是提供程序配方上的语法糖 这给我的印象是,所有服务都是提供者。但我目前在应用程序的配置块中使用$window服务时遇到了一个问题,我遇到了以下文档: 模块是配置和运行块的集合,这些块 在引导过程中应用于应用程序。在其 最简单的形式模块由两种 区块:Javascript 服务是提供者的子集,还是不是?,javascript,angularjs,Javascript,Angularjs,2015年4月编辑 到目前为止,我得到的答案解释了服务/工厂/和供应商之间的区别,但这并没有真正理解我所困惑的。AngularJS文档断言,这三个代码本质上是“引擎盖下”相同的代码。但如果是这样,为什么我只能将“提供者”传递到配置块中,而不是“工厂” 原始问题: 根据报告: 最详细、也是最全面的一个是提供者 配方其余四种配方类型-价值、工厂、服务和 常量-只是提供程序配方上的语法糖 这给我的印象是,所有服务都是提供者。但我目前在应用程序的配置块中使用$window服务时遇到了一个问题,我遇到了以
- 配置块-在提供程序注册和配置阶段执行仅提供程序和 可以将常量注入到配置块中。这是为了 防止服务在启动之前意外实例化 完全配置。
这意味着提供者和服务之间存在着区别,这比服务配方更为基本,服务配方只是“语法糖”,而不是提供者配方。怎么回事?基本上发生的是 当您创建一个
factory()
时,它会将第二个参数中提供的函数设置为提供程序的$get并返回它(provider(name,{$get:factoryFn})
),您得到的只是提供程序,但除了该提供程序的$get之外,没有其他属性/方法(意味着您无法配置它)
工厂来源
function factory(name, factoryFn, enforce) {
return provider(name, {
$get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn
});
}
当创建服务()
时,它返回您提供的带有注入构造函数的函数的工厂()(返回您在服务中提供的构造函数的实例)并返回它
服务的源代码
function service(name, constructor) {
return factory(name, ['$injector', function($injector) {
return $injector.instantiate(constructor);
}]);
}
因此,基本上在这两种情况下,您最终都会为您提供的函数设置一个providers$get,但您可以提供$get以外的任何内容,正如您最初在provider()中为配置块提供的那样一个
提供程序是一个通过其$get
方法实例化服务的提供程序。提供程序用于在模块的config
阶段中可用,从而在应用程序运行之前配置服务
服务只是一个注入的单例。您可以通过以下方式定义服务:
- 调用
myModule.service('serviceName',ServiceConstructor)
,其中ServiceConstructor
是您通常使用的new
构造函数
- 调用
myModule.factory('serviceName',factoryFunction)
,其中factoryFunction
是一个返回服务实例的函数
- 调用
myModule.value('serviceName',serviceInstance)
,其中serviceInstance
是将被注入的实际对象
- 调用
myModule.provider('serviceName',serviceProvider)
,其中serviceProvider
是具有返回服务实例的$get
方法的某个对象
关键是服务是实例。如果使用“提供者配方”(第四个项目符号)定义服务,是否允许将其注入配置块?可以将提供者注入配置块,但不能将服务本身注入。