正确定义DI的Angular 2.1.2 ES5服务

时间:2016-11-07 14:43:20

标签: javascript angular ecmascript-5

我已经定义了一个Angular 2服务,该服务注入了Http服务并被其他组件使用,但我不认为我已经正确地完成了它:

(function (app) {
'use strict';
app.LoaderService = ng.core.Component({
    providers: [ng.http.Http],
    // TODO We shouldn't need to define a template in a service. Maybe service shouldn't be a Component?
    template: ''
  }).Class({
    constructor: [ng.http.Http, function (http) {
        this.http = http;
    }],
    getData: function (url, target) {
        var getter = this.http.get(url);
        getter.subscribe(function (result) {
            target.data = result.json();
        });
    }
  });
})(window.app || (window.app = {}));

虽然这有效,但使用了&ng; ng.core.Component'迫使我定义一个“模板”,否则我会得到一个未指定的模板'错误,但它实际上只是一项服务,它不应该需要一个模板。

我尝试使用' ng.core.Injectable()来定义它.Class(...)'就像这个问题:

create an angular 2 service in es5

但是这会产生错误&n; ng.core.Injectable(...)。类不是函数'。也许Angular已经改变了,因为答案是写的?

还有很多将服务编写为简单函数的例子,但这不会让我将Http服务注入其中。

我应该如何在纯Javascript中定义服务以支持将Http注入其中并允许将其注入组件?

1 个答案:

答案 0 :(得分:1)

是的,不再有Class属性。

ng2 beta-5的源代码如下:

TypeDecorator.annotations = chainAnnotation;
TypeDecorator.Class = Class;
if (chainFn) chainFn(TypeDecorator);
return TypeDecorator;

https://github.com/angular/angular/blob/2.0.0-beta.5/modules/angular2/src/core/util/decorators.ts#L247-L267

今天您只需使用ng.core.Class即可获得服务。这是备忘单

这是 Plunker Example