ES6类和Babel的角度服务

Jus*_*tin 8 angularjs ecmascript-6 angular-services

我正在尝试使用ES6类作为Angular服务,但是当它被实例化时,方法无法访问构造函数变量.

class dataWrapperService {

    constructor($q, $log) {
        this.$q = $q;
        this.$log = $log;
    }

    data() {
        console.log(this.$q);
    }
}

dataWrapperService.$inject = ['$q', '$log'];

app.service('dataWrapper', dataWrapperService);
Run Code Online (Sandbox Code Playgroud)

一旦服务被Angular注入并且我在其上调用data方法,该方法就无法访问构造函数值.

// calling the data method results in an error
dataWrapper.data();   //TypeError: Cannot read property '$q' of undefined

//  console.log output of dataWrapper:
Object
  $log: Object
  $q: Q(resolver)
  __proto__: smDataWrapperService
    constructor: smDataWrapperService($q, $log)
    data: data()
    __proto__: Object
Run Code Online (Sandbox Code Playgroud)

但...

我可以手动dataWrapperService和工作得很好.

var dataWrapper = new smDataWrapperService("hello", "sir");
dataWrapper.data();   // "hello"
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

更新:


这似乎只发生在promise回调中:

我通常将函数传递给then/catch,如下所示:

$http.get('whatever').then(dataWrapper.data);
Run Code Online (Sandbox Code Playgroud)

但只有以下内容才有效:

$http.get('whatever').then((response) => smDataWrapper.data(response))
Run Code Online (Sandbox Code Playgroud)

AWo*_*olf 3

Angular 需要一个函数app.factory('dataWrapper', dataWrapperService);而不是一个类。

您可以将静态工厂方法添加到您的类中,并将其添加到app.factory. (请参阅下面的更新代码片段)

像这样的代码应该可以工作:

class dataWrapperService {

    constructor($q, $log) {
        this.$q = $q;
        this.$log = $log;
    }

    data() {
        console.log(this.$q);
    }

    static dataWrapperFactory($q, $log) {
        dataWrapperService.instance = new dataWrapperService($q, $log);
        return dataWrapperService.instance;
    }
}

dataWrapperService.$inject = ['$q', '$log'];

app.factory('dataWrapper', dataWrapperService.dataWrapperFactory);
Run Code Online (Sandbox Code Playgroud)

更新

正如评论中提到的,你的代码应该可以工作,因为 ES6 类是一个构造函数,这就是所angular.service期望的。

我稍后会检查您的代码是否存在任何其他问题。