无法在注册为 Angular 服务的 ES6 类中共享对象

Can't share object inside ES6 class that's registered as an Angular service

本文关键字:ES6 共享 对象 服务 注册 Angular      更新时间:2023-09-26

我有以下 Angular 代码,我试图在整个类中共享一些服务:

class StreamingService {
  constructor($q, someService) {
    this.$q = $q;
    this.someService = someService;
    this.getMenu = function () {
      return $q(function (resolve, reject) {
        someService.client.getId().load(123)
          .then(function (data) {
            resolve(data.menu);
          }, function (err) {
            reject(err);
          });
      });
    };
  }
  getStreaming() {
    let { $q, getMenu, someService } = this;
    someService.onConnected(function () {
      getMenu()
        .then(function (menu) {
          return menu.map(function (elem) {
            if (elem.id === 'live') {
              return elem.livestream[0];
            }
          });
        });
    });
  }
}
StreamingService.$inject = ['$q', 'someService'];
export default angular.module('services.streaming-service', [])
  .service('streamingService', StreamingService)
  .name;

但是我得到一个"某些服务"没有定义。当我从 getStreaming 属性内部控制台记录"this"时,我没有获取构造函数中的元素,而是获取类的其他属性。你知道发生了什么吗?谢谢 (:

如果

可以的话,我会发表评论,因为我不确定这是答案,但我不到 50 次,所以我不能。

我对 Angular 不太熟悉,但在普通的 javascript 中,这是行不通的,因为你在构造函数中定义了你的变量是公共的。

使用 this.someService 引用某些服务,它应该可以工作(在 getStreaming() 方法中)

编辑:顺便说一下,this可能不引用对象,对于嵌套函数,这发生在我身上。为了避免它,在构造函数中创建一个私有变量,如var self = this;,并引用该变量以指向对象。

这对

我有用:

class StreamingService {
  constructor(v) { this.v = v; }
  getStreaming() { let {v} = this; console.log(v) } 
}
var s = new StreamingService(5);
s.getStreaming(); //prints 5

。角度"服务"应该用new实例化你的类,如上例所示,所以到目前为止你描述的设置似乎没有任何错误。

我会在检查器中仔细查看this对象,因为"我没有获得构造函数中的元素,而是获取类的其他属性"似乎表明this绑定到类(?)的原型对象。

我还会确保按预期调用您的类构造函数。

我还会在调试器中设置一个断点,以查看您的类方法是如何调用的,以及这个this对象来自哪里。