从 ES6 class 方法调用 angular 服务

Calling angular service from ES6 class method

(我使用 Babel 才能使用 ES6)

当我调用 addConfigurationToCart() 时,我得到:

ReferenceError: Order is not defined.

但在构造函数中我没有。这是为什么?如果我将 Order 作为参数添加到 addConfigurationToCart

,我会得到同样的错误
class ConfigCtrl {
    constructor($state, api, Order) {
        this.current = Order.current;
    }

    addConfigurationToCart() {
        Order.saveConfiguration();
        $state.go('order');
    }
}

您必须为 class 的其余部分提供服务 public。

class ConfigCtrl {
  constructor($state, api, Order) {
      ...
      this.Order = Order;
  }

  addConfigurationToCart() {
      this.Order.saveConfiguration();
      ...
  }
}

constructoraddConfigurationToCart 函数有不同的作用域(在 JS 意义上),当然,一个作用域中的变量在另一个作用域中不可用,除非变量被分配给 this 属性 或来自父作用域的变量。

私有变量在 ES2015+ 中仍然不存在,但是 some workarounds 可以做到这一点。

最明显的方法是使用局部变量:

let $state, api, Order;

class ConfigCtrl {
  static $inject = ['$state', 'api', 'Order'];

  constructor(...args) {
    [$state, api, Order] = [...args];
    // ...
  }

  addConfigurationToCart() {
    Order.saveConfiguration();
    // ...
  }
}

以及在 class 中成功提供私有变量的更多惯用方法:

const [$state, api, Order] = [Symbol(), Symbol(), Symbol()];

class ConfigCtrl {
  static $inject = ['$state', 'api', 'Order'];

  constructor(...args) {
    [$state, api, Order].forEach((v, i) => this[v] = args[i]);
    // ...
  }

  addConfigurationToCart() {
    this[Order].saveConfiguration();
    // ...
  }
}
controller: class {
    constructor($http, Restangular, $state) {
        Object.assign(this, {$http, Restangular, $state});
    }
    doIt() {
       // use this.$http, this.Restangular & this.$state freely here
    }
}