11

我想注入一个类的实例。从这个线程看起来服务返回新的 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);
4

3 回答 3

17

您可以使用为您的类返回构造函数的工厂:

app.factory('myKlass', function() {
  return Klass
});

更简单地说,如果Klass在其他地方定义,您可以使用value

app.value('myKlass', Klass);

无论哪种方式,都照常注入。

function CtrlA($scope, myKlass)
{
  new myKlass();
}

看到这个 jsFiddle

[编辑] 另请参阅此 Google Groups 帖子此相关示例

于 2012-11-29T07:04:56.460 回答
4

为了清楚起见,我创建了一个小 Plunker

它有一个服务和一个工厂。Service 和 Factory 有一个值和 setter 和 getter。

两者都注入到控制器 A 和 B。如果您更改控制器 A 中的服务的值,此更改也会发生在控制器 B 中,因为服务是单例。

但是,当您在控制器 B 中更改 Factory 中的值时,这只会影响 B,因为更改仅发生在 B 中创建的实例中。

享受!

于 2013-08-14T13:47:15.920 回答
0

马克西米利安 - 谢谢你的好例子。

我将其转换为 JSFiddle,作为试验我想深入研究的另一种设计模式的地方。为什么将提供程序类型从“服务”切换到“工厂”似乎仍然有效?似乎更多关于如何创建提供者,即使用“新”而不是直接引用它。

此外,在服务中,是否存在关于为什么服务应该实现“this”关键字的设计模式,而不是使用 return { myAccessor : function () { return val; } }

http://jsfiddle.net/jeffsteinmetz/XF69p/

在这个 jsfiddle 中,您可以更改一行代码(第 23 行),它仍然有效,代码行可以是:

App.service('MyService', function() {

或者

App.factory('MyService', function() {    

为什么这两个都有效?

似乎更多的是关于您如何使用“新”来引用服务

  var myInstance = new MyFactory();

这与直接调用它不同

  MyService.getVal()

任何有角的人都关心列出最佳实践和背后的推理:

  • 何时使用“新”以及何时不需要新
  • 为什么使用“this”参考方法来定义您的提供者而不是 return { accessorName : function}
  • 为什么在上面的例子中工厂或服务都工作?
于 2014-03-19T05:38:48.857 回答