我一直反复遇到相同的问题。我正在使用Typescript创建电子应用程序。我有一组后端控制器。 AppController对与文件系统的交互具有管辖权。 WindowController拥有所有基本窗口功能的管辖权。这是代码的简化版本:
AppController.ts
export class AppController {
windowCtrl: WindowController
constructor() {
this.windowCtrl = new WindowController(Init Details);
this.windowCtrl.windowEvents.on('window:get-parent-directory',
() => {
console.log('made it here');
});
}
}
WindowController.ts
export class WindowController {
public windowEvents: EventEmitter;
constructor(Init Details) {
this.windowEvents = new EventEmitter();
// this.windowEvents is defined here.
ipcMain.on('get-parent', getParentDirecotry);
}
getParentDirectory() {
this.windowEvents.emit('window:get-parent-directory');
// this.windowEvents is undefined here
}
}
事件发射器 windowEvents 通过消息在两个类之间进行通信。我已经使用Angular中的EventEmitters完成了同样的事情,并且通读了节点文档以确保没有犯一个愚蠢的错误。我已经做了很多研究,但是我发现的只是人们没有在构造函数中初始化它的例子。我没有选择权,也不知道我缺少什么。电子出现的BrowserWindow实例也发生了同样的问题。我在构造函数中对其进行了初始化,该窗口在屏幕上打开,并且当我尝试从该类的成员函数中调用它时,它是未定义的。
有什么想法吗?
答案 0 :(得分:0)
如果您确定自己的代码正确无误,但undefined
却是毫无原因的,则可能是因为您遇到了循环依赖问题。
您用来构建项目的工具可能已经找到了两个模块,它们直接或间接地相互依赖。要解决这种情况,它必须从某处开始,但是要暂时将一个模块标记为undefined
。
您可以使用静态分析来验证是否是这种情况。如果您使用的是TSLint,则tslint-no-circular-imports
规则提供了这一点。还有一个Webpack plugin做同样的事情。