Angular 组件:扩展 class 的实例似乎被覆盖
Angular components: instance of extended class seems to get overwritten
在我的 angular 8 项目中,我有一个 class(只是一个 class,未作为组件实现),它提供了一些默认配置和方法。
此 class 由多个组件扩展。如果同一视图上的多个组件(即同时存在)扩展 class 它们的实例似乎会相互覆盖。如果我覆盖其中一个组件中的属性或方法,然后另一个组件被实例化,则覆盖消失。
我不知道为什么会这样。扩展 class 的构造函数被多次调用,因此理论上,每个扩展 class 都应该创建自己的实例。
更新
我在这个 StackBlitz 演示中重现了这个问题:https://stackblitz.com/edit/angular-hw1cv9
ListComponent 和 PopupComponent 都扩展了 DataGridComponent。在 ListComponent 中,我在模板中启用了导出功能并且始终有效。我还覆盖了 onExporting 事件处理程序。如果您注释掉弹出窗口(或阻止使用 *ngIf="popupVisible" 创建它),此覆盖工作正常,但它会按原样恢复到弹出窗口的原始功能。
(我不知道如何在演示中显示 devextreme 图标,抱歉。导出按钮在 table 上方的左侧)。
用解决方案更新了演示
您正在设置 DataGrid 对象本身的默认选项。任何继承您的组件或从其他地方导入 DataGrid 的 Class 都将是您在 DataGridComponents 构造函数中设置的配置。
您确定要直接将默认选项分配给 DataGrid 对象吗?
在我的 angular 8 项目中,我有一个 class(只是一个 class,未作为组件实现),它提供了一些默认配置和方法。
此 class 由多个组件扩展。如果同一视图上的多个组件(即同时存在)扩展 class 它们的实例似乎会相互覆盖。如果我覆盖其中一个组件中的属性或方法,然后另一个组件被实例化,则覆盖消失。
我不知道为什么会这样。扩展 class 的构造函数被多次调用,因此理论上,每个扩展 class 都应该创建自己的实例。
更新
我在这个 StackBlitz 演示中重现了这个问题:https://stackblitz.com/edit/angular-hw1cv9
ListComponent 和 PopupComponent 都扩展了 DataGridComponent。在 ListComponent 中,我在模板中启用了导出功能并且始终有效。我还覆盖了 onExporting 事件处理程序。如果您注释掉弹出窗口(或阻止使用 *ngIf="popupVisible" 创建它),此覆盖工作正常,但它会按原样恢复到弹出窗口的原始功能。
(我不知道如何在演示中显示 devextreme 图标,抱歉。导出按钮在 table 上方的左侧)。
用解决方案更新了演示
您正在设置 DataGrid 对象本身的默认选项。任何继承您的组件或从其他地方导入 DataGrid 的 Class 都将是您在 DataGridComponents 构造函数中设置的配置。
您确定要直接将默认选项分配给 DataGrid 对象吗?