我们正在使用角度常数来定义类。我该如何做到这样,以便实例化类常量的类常量可以在构造函数中具有参数,但是还具有依赖项注入?我在想这样的话:

ClassA.js

class ClassA { ... }

angular.module("myApp").constant("ClassA", ClassA);


ClassB.js

class ClassB {
  constructor(constrParams, ClassA) { // mix of constructor parameter and DI
    this.constrParams = constrParams;
    this.ClassA = ClassA;
  }
}

ClassB.$inject = ["ClassA"]; // ClassB needs reference to ClassA
angular.module("myApp").constant("ClassB", ClassB);


在另一个常量中导入ClassB时,我仍然能够做到这一点

ClassC.js

class ClassC {
  constructor(ClassB) {
    this.classBinst = new ClassB("myparams"); // instantiate new ClassB instance
  }
}

ClassC.$inject = ["ClassB"];
angular.module("myApp").constant("ClassC", ClassC);

最佳答案

如果您想手动传递任何构造函数参数,我认为您必须手动传递它们。

因此,ClassC也必须接受ClassA作为参数,然后将其传递给ClassB

class ClassC {
  constructor(ClassB, ClassA) {
    this.classBinst = new ClassB("myparams", ClassA); // instantiate new ClassB instance
  }
}


但是,如果创建需要ClassDClassC,则会遇到相同的问题-需要将ClassC及其所有依赖项(ClassBClassA)传递给我们。

但是,如果ClassC是最终级别并且可以实例化并作为单例注入,则可以创建一个实例化ClassC的服务,而不必担心其依赖关系:

angular.module("myApp").service('instanceC', ClassC);

angular.module("myApp").controller('myController', function (instanceC) {
    // Everything has been resolved
});


也许您最好创建一个服务来为您创建这些类的实例。该服务可以解决类所需的依赖关系,并手动传递它们,而控制器可以传递任何自定义参数:

class factory {
    constructor(ClassA, ClassB, ClassC) {
        this.ClassA = ClassA;
        this.ClassB = ClassB;
        this.ClassC = ClassC;
    }

    createB(customParamForClassB) {
        return new this.ClassB(customParamForClassB, this.ClassA)
    }
}

angular.module("myApp").service('factory', factory);

angular.module("myApp").controller('myController', function (factory) {
    let instanceB = factory.createB('myparams');
});

10-06 11:07