我想注入一个类的实例。从这个线程看起来服务返回新的serviceArgFunction,这就是我想要的。 https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/VxECXKbn3gsJ
但我似乎无法让它发挥作用。出于某种原因,我的两个共享状态实例。任何人都可以帮我弄清楚我做错了什么? http://jsfiddle.net/kTjMy/5/
var Klass = function() {
this.count = 0;
this.getAndIncCount = function() {
this.count += 1;
return this.count;
};
};
app.service('service', Klass);
答案 0 :(得分:17)
您可以使用返回类的构造函数的工厂:
app.factory('myKlass', function() {
return Klass
});
更简单的是,如果Klass
在其他地方定义,则可以使用value
:
app.value('myKlass', Klass);
无论哪种方式,都可以正常注射。
function CtrlA($scope, myKlass)
{
new myKlass();
}
请参阅this jsFiddle。
答案 1 :(得分:4)
为了说清楚,我创建了a little Plunker。
它有服务和工厂。 服务和工厂有价值和制定者和吸气剂。
两者都注入控制器A和B. 如果更改控制器A中的服务值,则此更改也会在控制器B中进行,因为该服务是单例。
但是当您在控制器B中更改工厂中的值时,这仅影响B,因为更改仅在B中创建的实例中进行。
享受!
答案 2 :(得分:0)
Maximilian - 谢谢你的好榜样。
我将它转换为JSFiddle,作为一个尝试我想深入研究的另一种设计模式的地方。 为什么将提供者类型从“服务”交换到“工厂”似乎仍然有效? 似乎更多的是关于如何创建提供者,即使用“新”而不是直接引用它。
此外,在服务中,是否存在关于服务应该实现“this”关键字的设计模式,而不是使用return {myAccessor:function(){return val; }}
请参阅 http://jsfiddle.net/jeffsteinmetz/XF69p/
在这个jsfiddle中,你可以改变代码的一行(第23行),它仍然可以工作,代码行可以是:
App.service('MyService', function() {
或
App.factory('MyService', function() {
为什么这两种都有效?
似乎更多关于如何使用“new”
引用服务 var myInstance = new MyFactory();
与直接调用它不同
MyService.getVal()
任何有棱有角的人都会关注这背后的最佳实践和推理: