diff --git a/src/dataSources/types.ts b/src/dataSources/types.ts index 8b21cc7d7..cbd4ddaa6 100644 --- a/src/dataSources/types.ts +++ b/src/dataSources/types.ts @@ -21,6 +21,11 @@ export interface DataRecordProps extends ObjectAny { id: string; } +export interface DataVariableListener { + obj: any; + event: string; +} + /**{START_EVENTS}*/ export enum DataSourcesEvents { /** diff --git a/src/dom_components/view/ComponentDataVariableView.ts b/src/dom_components/view/ComponentDataVariableView.ts index 0528d4e01..2bf2bf6c3 100644 --- a/src/dom_components/view/ComponentDataVariableView.ts +++ b/src/dom_components/view/ComponentDataVariableView.ts @@ -1,12 +1,15 @@ -import { DataSourcesEvents } from '../../dataSources/types'; +import { DataSourcesEvents, DataVariableListener } from '../../dataSources/types'; import { stringToPath } from '../../utils/mixins'; import ComponentDataVariable from '../model/ComponentDataVariable'; import ComponentView from './ComponentView'; export default class ComponentDataVariableView extends ComponentView { + dataListeners: DataVariableListener[] = []; + initialize(opt = {}) { super.initialize(opt); this.listenToData(); + this.listenTo(this.model, 'change:path', this.listenToData); } listenToData() { @@ -15,16 +18,21 @@ export default class ComponentDataVariableView extends ComponentView this.stopListening(ls.obj, ls.event, this.postRender)); - if (ds) { - this.listenTo(ds.records, 'add remove reset', this.postRender); - this.listenTo(ds.records, 'add remove reset', this.postRender); - dr && this.listenTo(dr, 'change', this.postRender); - } + ds && dataListeners.push({ obj: ds.records, event: 'add remove reset' }); + dr && dataListeners.push({ obj: dr, event: 'change' }); + dataListeners.push( + { obj: model, event: 'change:path change:value' }, + { obj: DataSources.all, event: 'add remove reset' }, + { obj: em, event: `${DataSourcesEvents.path}:${normPath}` } + ); - this.listenTo(DataSources.all, 'add remove reset', this.postRender); - this.listenTo(em, `${DataSourcesEvents.path}:${normPath}`, this.postRender); - this.listenTo(model, 'change:path change:value', this.postRender); + dataListeners.forEach(ls => this.listenTo(ls.obj, ls.event, this.postRender)); + this.dataListeners = dataListeners; } postRender() { diff --git a/test/specs/dataSources/index.ts b/test/specs/dataSources/index.ts index ecd165e8a..5132272c7 100644 --- a/test/specs/dataSources/index.ts +++ b/test/specs/dataSources/index.ts @@ -96,16 +96,26 @@ describe('DataSourceManager', () => { }); test('component is properly updating on its path change', () => { + const eventFn1 = jest.fn(); + const eventFn2 = jest.fn(); const ds = addDataSource(); const cmpVar = addDataVariable(); const el = cmpVar.getEl()!; + const pathEvent = DataSourcesEvents.path; + cmpVar.set({ path: 'ds1.id2.name' }); expect(el.innerHTML).toBe('Name2'); + em.on(`${pathEvent}:ds1.id2.name`, eventFn1); + ds.getRecord('id2')?.set({ name: 'Name2-UP' }); + cmpVar.set({ path: 'ds1[id3]name' }); expect(el.innerHTML).toBe('Name3'); - + em.on(`${pathEvent}:ds1.id3.name`, eventFn2); ds.getRecord('id3')?.set({ name: 'Name3-UP' }); + expect(el.innerHTML).toBe('Name3-UP'); + expect(eventFn1).toBeCalledTimes(1); + expect(eventFn2).toBeCalledTimes(1); }); describe('DataSource changes', () => {