如何销毁Angular / Ionic中动态创建的组件中的事件?

时间:2019-12-13 14:30:15

标签: javascript angular ionic4

所以基本上我有不同问题类型(选择,单选,复选框等)的巨大JSON对象。每个问题导致另一个问题。因此,我为每种类型创建了动态组件,并使用递归来加载它。除了一件事,一切似乎都可以正常工作...

我正在使用 ionChange 事件加载下一个问题

<ion-select okText="Okay" cancelText="Dismiss" placeholder="Select one..." [(ngModel)]="option_selected" (ionChange)="nextQuestion($event.detail.value.question)">
    <ion-select-option *ngFor="let option of action.options" [value]="option">{{ option.title }}</ion-select-option>
</ion-select>

在第一次加载时一切正常,但是如果在第二次选择之后进行第二次选择,则会立即触发 ionChange ,而没有任何选择,并且由于未选择,我在下一个问题上遇到了错误还没有

我只是将是否添加到 nextQuestion

nextQuestion(question) {
    if (question) {
        this.questionChanged.emit(question);
    }
}

但是它不是一个好的解决方案,因为在显示其他组件之前应该完全销毁动态组件,但是似乎事件绑定仍然存在。或者它不是驱逐舰...

onQuestionChanged(question) {
    this.container_tab_action.clear();

    if (this.componentRef) {
        this.componentRef.destroy();
    }

    let factory;

    switch (question.type) {
        case 'choice':
            factory = this.componentFactoryResolver.resolveComponentFactory(TabsChoiceComponent);
        break;

        case 'yesno':
            factory = this.componentFactoryResolver.resolveComponentFactory(TabsChoiceComponent);
        break;
    }

    if (!factory) {
        return;
    }

    this.componentRef = this.container_tab_action.createComponent(factory);

    this.componentRef.instance.question  = this.question;

    this.componentRef.instance.questionChanged.subscribe(event => this.onQuestionChanged(event));

}

0 个答案:

没有答案