Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何处理从基类构造函数调用的派生类中的事件?_Javascript_Javascript Events_Event Handling_Typescript - Fatal编程技术网

Javascript 如何处理从基类构造函数调用的派生类中的事件?

Javascript 如何处理从基类构造函数调用的派生类中的事件?,javascript,javascript-events,event-handling,typescript,Javascript,Javascript Events,Event Handling,Typescript,我认为这更多的是一个设计问题,但这里是 我有一个使用Typescript的web应用程序。 我有一个从基类继承的类。 基类在其构造函数中调用一些初始化代码(如download.xml文件)。 下载完成后,它会调用一个事件(例如Init_Completed) 现在,我需要派生类来处理这个事件。我知道我可以在基类中注册此事件,并在派生类中重载该处理程序方法 但是,我需要派生类能够注册此事件处理程序,如下所示: this.OnLoaded += this.LoadedCompleted; 问题是:

我认为这更多的是一个设计问题,但这里是

我有一个使用Typescript的web应用程序。 我有一个从基类继承的类。 基类在其构造函数中调用一些初始化代码(如download.xml文件)。 下载完成后,它会调用一个事件(例如Init_Completed)

现在,我需要派生类来处理这个事件。我知道我可以在基类中注册此事件,并在派生类中重载该处理程序方法

但是,我需要派生类能够注册此事件处理程序,如下所示:

this.OnLoaded += this.LoadedCompleted;
问题是:

如何正确地设计这个?。。。因为加载是在中启动的 基类构造函数。这意味着加载的事件可能是 在派生类有机会注册/侦听之前调用 这件事


在调用基类构造函数之前,可以初始化子类中的成员:

class A{    
    constructor(){
       // register here
    }
}

class B extends A{
    b;
    constructor(){
        this.b = 123;   // Setup members here       
        super();
    }
}
如何正确地设计这个?在派生类更改为此事件注册/侦听之前,可以调用加载的事件

我建议对这类只触发一次的事件使用承诺,比如文件的
load
事件。承诺确实很好地解决了这一问题

  • 它们支持多个独立的处理程序
  • 注册时间无关紧要-当值可用时,每个处理程序都会尽快执行

您可以,并且您可以免费获得简单的错误处理和链接/合成。

我不确定我是否正确理解了您的问题。在我看来,你并不需要一个活动:

考虑:

class Base {
    constructor() {
        init(this.afterInit.bind(this));
    }

    init(callback: Function): void {
        //Do something asynchronous
    }

    afterInit() {
         //Do something after initialization
    }
}

class Derived extends Base {

     constructor() {
         super();
     } 

     afterInit() {
         super.afterInit();
         //Do something else after initialization
    }
}
但如果必须使用事件:

class MyEvent {

    register(handler: (sender: any) => void) {
        //Put the handler in a collection
    }

    raise() {
        //Invoke all the handlers
    }
}

class Base {

    onAfterInit = new MyEvent();

    constructor() {
        init();
    }

    init(): void {
        //Do something asynchronous
        //Then invoke the event
        this.onAfterInit.raise();
    }
}

class Derived extends Base {

     constructor() {
         super();
     } 

     init() {
         this.onAfterInit.register(sender => {
             //Do something after initialization
         })
         super.init();
    }
}

注册处理程序后只需调用super.init。这有帮助吗?

我建议使用一个off-sides EventEmitter在一个集中的位置处理所有事件。@RobG这是typescriptChange基类,以便调用在一个额外的方法(由构造函数调用)中。然后在子类中覆盖该方法。在该重写方法中添加或更改eventhandler,然后调用基类的方法(super.methodName();)。感谢您的输入。但我认为这并不能解决问题。问题是类B注册了一个处理程序(例如:super.onload.Add(this.MyLoaded);请注意,这个注册过程必须在super()之后进行。因为super()是将最终调用我的已加载事件,类B可能会也可能不会及时注册以处理该事件。不能保证在类A调用该事件时类B已准备就绪。要添加到我之前的注释中,类B中的变量B实际上在类A中(在我的情况下)。因此这不起作用,因为类A(即超级)尚未正式实例化。因此A.b未定义。