@@ -305,8 +305,7 @@ export type DataObserver = (...values: unknown[]) => void
305305
306306export type DataChange = DataReplace | DataSplice
307307// for replace
308- export type DataReplace = [ DataPath , DataValue , RequireComparer , undefined ]
309- export type RequireComparer = true | undefined
308+ export type DataReplace = [ DataPath , DataValue , undefined , undefined ]
310309// for splice, numbers are index, removal count
311310export type DataSplice = [ DataPath , DataValue [ ] , number , number ]
312311
@@ -525,6 +524,8 @@ export class DataGroup<
525524 } | null = null
526525 /* @internal */
527526 private _$recUpdateLevel = 0
527+ /* @internal */
528+ private _$propertyComparer : ( ( a : DataValue , b : DataValue ) => boolean ) | null
528529
529530 /* @internal */
530531 private _$generateInnerData ( data : { [ key : string ] : DataValue } ) {
@@ -558,6 +559,7 @@ export class DataGroup<
558559 propertyPassingDeepCopy : DeepCopyStrategy ,
559560 reflectToAttributes : boolean ,
560561 observerTree : DataGroupObserverTree ,
562+ propertyComparer : ( ( a : DataValue , b : DataValue ) => boolean ) | null ,
561563 ) {
562564 this . _$comp = associatedComponent
563565 this . data = data
@@ -568,6 +570,7 @@ export class DataGroup<
568570 this . _$propFields = observerTree . propFields
569571 this . _$observerTree = observerTree
570572 this . _$observerStatus = new Array ( observerTree . observers . length ) as boolean [ ]
573+ this . _$propertyComparer = propertyComparer
571574 this . innerData = this . _$generateInnerData ( data )
572575 }
573576
@@ -581,6 +584,7 @@ export class DataGroup<
581584 DeepCopyStrategy . None ,
582585 false ,
583586 new DataGroupObserverTree ( { } ) ,
587+ null ,
584588 )
585589 }
586590
@@ -637,7 +641,7 @@ export class DataGroup<
637641 data = simpleDeepCopy ( newData )
638642 }
639643 }
640- this . _$pendingChanges . push ( [ [ propName ] , data , true , undefined ] )
644+ this . _$pendingChanges . push ( [ [ propName ] , data , undefined , undefined ] )
641645 return true
642646 }
643647
@@ -794,19 +798,14 @@ export class DataGroup<
794798
795799 // run comparer for properties
796800 let comparerResult : boolean
797- if ( ! isSplice && maybeSpliceIndex === true ) {
798- if ( prop . comparer ) {
799- change [ 2 ] = undefined
800- comparerResult = ! ! safeCallback (
801- 'Property Comparer' ,
802- prop . comparer ,
803- comp ! ,
804- [ newData , oldData ] ,
805- comp ?. general ( ) ,
806- )
807- } else {
808- comparerResult = oldData !== filteredData
809- }
801+ if ( ! isSplice && ( prop . comparer || this . _$propertyComparer ) ) {
802+ comparerResult = ! ! safeCallback (
803+ 'Property Comparer' ,
804+ prop . comparer || this . _$propertyComparer ! ,
805+ comp ! ,
806+ [ newData , oldData ] ,
807+ comp ?. general ( ) ,
808+ )
810809 changed = comparerResult
811810 } else {
812811 comparerResult = oldData !== filteredData
0 commit comments