diff --git a/packages/devextreme-react/src/core/__tests__/props-updating.test.tsx b/packages/devextreme-react/src/core/__tests__/props-updating.test.tsx index e4eca777a6e5..c841f276a9c3 100644 --- a/packages/devextreme-react/src/core/__tests__/props-updating.test.tsx +++ b/packages/devextreme-react/src/core/__tests__/props-updating.test.tsx @@ -1042,6 +1042,38 @@ describe('cfg-component option control', () => { expect((optionsManager as any).setValue).toHaveBeenCalledTimes(1); }); + it('does not crash when option change handler unmounts component (T1327953)', () => { + const optionsManager = new OptionsManagerModule.OptionsManager(); + const config = { + name: '', + predefinedOptions: {}, + initialOptions: {}, + options: { + value: 1, + onValueChange: () => { + optionsManager.dispose(); + }, + }, + templates: [], + configs: {}, + configCollections: {}, + }; + + optionsManager.setInstance({ + skipOptionsRollBack: false, + option: jest.fn(), + resetOption: jest.fn(), + on: jest.fn(), + off: jest.fn(), + beginUpdate: jest.fn(), + endUpdate: jest.fn(), + }, config, ['value'], []); + + expect(() => { + optionsManager.onOptionChanged({ name: 'value', value: 2, fullName: 'value' }); + }).not.toThrow(); + }); + it('apply cfg-component option change if value really change', () => { const TestContainer = (props: any) => { const { value } = props; diff --git a/packages/devextreme-react/src/core/options-manager.ts b/packages/devextreme-react/src/core/options-manager.ts index 2681307e8ce4..df00edd60b6b 100644 --- a/packages/devextreme-react/src/core/options-manager.ts +++ b/packages/devextreme-react/src/core/options-manager.ts @@ -167,7 +167,7 @@ class OptionsManager { && e.value instanceof Object && shallowEquals(value as Record, e.value as Record); - if (valuesAreEqual || valuesAreEqualObjects || this.instance.skipOptionsRollBack) { + if (valuesAreEqual || valuesAreEqualObjects || this.instance?.skipOptionsRollBack) { return; }