如何将服务注入ES6帮助程序类

时间:2016-12-13 11:21:12

标签: angularjs ecmascript-6

考虑以下组件

import DoSomethingSpecial from '....';

export default MyComponentController {
    constructor() {
         this.result = new DoSomethingSpecial().getData();
    }
    ...
}

因此,MyComponentController当然是组件的控制器,DoSomethingSpecial类是ES215类。

我遇到的问题如下:在DoSomethingSpecial内部我想使用一些角度服务,比如$ http和/或$ q等。我怎样才能将这些注入这个类,例如:< / p>

export default class DoSomethingSpecial {
     constructor() {

     }

     getData() {
          let $q = angular.injector().get('$q');
          ....
     }
}

然而,这不起作用。还有其他方法,还是应该将此类更改为服务?

更新:一个可能的用例:假设您在服务中下载了一个对象列表,您可以将其转换为MyRecordItems的实例,如下所示

import MyRecordItem from '...';

export default class MyRecordsService {
     constructor($http) {
         $http.get('url', { options}).then((response) => {
             this.records = [];

             response.data.forEach((item) => {
                 this.records.push(new MyRecordItem(item));
             });
         });
    }
}

接下来,在您应用的某个地方使用此列表 - &gt;修改 - &gt; <保存

let list = myRecordService.getList();
list[0].count = 10;
list[0].save();

此记录如何持续存在?它可以如下

 export default class MyRecordItem {
     constructor(data) { this.data = data; }
     save() {
         let url = ....;
         return angular.$injector.get('$http').post(url, this.data)
     }
 }

1 个答案:

答案 0 :(得分:2)

将ES6类所需的依赖项注入控制器的构造函数(在本例中为$q)。将$q注入控制器后,创建该类的实例,并将$q作为参数传递给构造函数。将实例分配给this

import DoSomethingSpecial from '....';

class MyComponentController {

     constructor($q) {
        'ngInject';

       this.doSomethingSpecialInstance = new DoSomethingSpecial($q); // instantiate the service, and pass the dependencies
     }

     getData() {
          this.result = doSomethingSpecialInstance().getData(); // use the instance
     }
}

export default MyComponentController;

和班级定义:

export default class DoSomethingSpecial {
  constructor($q) {
    this.$q = $q;
  }

  getData() {
    // do something with this.$q
  }
}