我的服务是在nodejs中设计的。 以下是我的情况 我有两个控制器,一个将扩展另一个。两个控制器中都有一个静态函数,其中的静态变量将被分配一些值。 根据数据条件,尝试调用相应的控制器,以使静态变量获得适当的分配值。
注意:
下面的代码只是用于说明场景的摘录,而不是应用程序的实际代码。但是此代码段的命令/调用/控制器结构完全相同。同样,在firstController和secondController的checkStart函数中,listOfDept变量将具有单独的业务逻辑。
// firstController.ts
firstController implements IFirstController {
private static listOfDept: string[];
static checkStart(){
firstController.listOfDept = // my logic to fill this object
}
constructor (){}
}
getRelevantData(next: (error: string, response: any) => void): void {
var myObject = firstController.listOfDept;
this.myRepository.uniqueData(myObject, next);
}
}
firstController.checkStart();
export = firstController;
//ifirstController.ts
interface IFirstController {
getRelevantData(next: (error: string, response: any) => void): void;
}
// secondController.ts
secondController extends firstController implements iSecondController {
private static listOfDept: string[];
static checkStart(){
firstController.listOfDept = ["Computer Science"];
}
constructor (){
super();
}
}
secondController.checkStart();
export = secondController;
//isecondController.ts
interface ISecondController implements ifirstController{}
//Controller calling the getRelevantData function
//middlewareController
middlewareController implements IMiddlewareController {
constructor(private firstController: IFirstController, private secondController: ISecondController) {
}
getDepData(data: any, next: (error: string, response: any) => void): void {
if(data.url = "fromParent") {
// im expecting this to make a call to checkStart() of firstController
this.firstController.getRelevantData();
} else {
// im expecting this to make a call to checkStart() of secondController
this.secondController.getRelevantData();
}
}
}
上述代码遇到的问题
无论以哪种方式调用getRelevantData函数,我总是以计算机科学的身份获取 listOfDept 的值。它永远不会出现在第一个控制器的checkStart功能中。
答案 0 :(得分:0)
通常,我不鼓励使用静态方法进行此类初始化,而是将所需的数据注入到构造函数中,或者创建用于使用必要数据创建对象的工厂方法。
但是,如果您确实想使用静态属性,则问题在于您需要在getRelevantData
实现中引用正确的父类。可以通过constructor
属性访问构造实例的类。 TypeScript无法很好地处理这种情况,因此您必须进行类型转换:
// firstController.ts
class firstController implements IFirstController {
// Need to be `protected` to be accessible from subclass
protected static listOfDept: string[];
static checkStart(){
firstController.listOfDept; // my logic to fill this object
}
constructor (){}
getRelevantData(next: (error: string, response: any) => void): void {
// You need to refer to the constructor
let Class = this.constructor as typeof firstController;
var myObject = Class.listOfDept;
// the rest
}
}
firstController.checkStart();
//ifirstController.ts
interface IFirstController {
getRelevantData(next: (error: string, response: any) => void): void;
}
// secondController.ts
class secondController extends firstController implements ISecondController {
// No `listOfDept` definition here
static checkStart(){
secondController.listOfDept = ["Computer Science"];
}
constructor (){
super();
}
}
secondController.checkStart();