如何在ESular Class的AngularJS控制器中保持注入的依赖项是私有的

时间:2016-02-10 10:32:27

标签: javascript angularjs dependency-injection ecmascript-6

我知道我的问题与this post有关,但我想知道是否有一种AngularJS特定的方法可以解决这个问题。

这是交易:

我在Angular指令中使用ES6 Class和ControllerAs,因此控制器声明如下:

class myCtrl {
  constructor ( $log ) {
    'ngInject';

    // Dependency Injections
    var privateLog  = $log;      // Private but scoped to constructor
    this.publicLog  = $log;      // Public

    // Default attributes
    this.foo = 'bar';

    this.publicLog.log('it works in constructor');  // logs 'it works in constructor'
    privateLog.log('it works in constructor');      // logs 'it works in constructor'
  }

  logSomething () {
    this.publicLog.log('it works in class method'); // logs 'it works in class method'
    try {
      privateLog.log('it works in class method');
    }
    catch(e) {
      console.log(e);                               // Uncaught ReferenceError: privateLog is not defined
    }
  }
}

var test = new myCtrl();

test.logSomething();
test.publicLog.log('is public');      // logs 'is public' 
try {
  test.privateLog.log('is private');
}
catch(e) {
  console.log(e);                     // Uncaught TypeError: Cannot read property 'log' of undefined
}

问题是我希望能够在所有classe方法中访问我的依赖注入, 但是我不想让它们从外面公开到达。

此外,我不想在构造函数中声明我的方法,因为我不想让它们为每个实例重新声明。

有没有正确的方法可以做到这一点,还是我错过了什么?

Here is the Fiddle

1 个答案:

答案 0 :(得分:0)

如果您想将注射剂保密,请使用经典的角度控制器结构,如此

function MyCtrl($log) {
   'ngInject';
   this.logSomething = function(message) {
       $log(message);
   }
}

现在实际$log隐藏在关闭状态,但logSomething可公开用于模板。

UPD。如果由于某种原因想要继续使用ES6类,可以尝试使用任何现有方法将某​​些类成员设为私有。有a review种可能的方法。