Estoy tratando de comparar listas usando un método de extensión que llama a un comparador así:
type HasDiff<T> = (object: T, row: any) => boolean; export const isListEqualToRows = <T>(objects: T[], rows: any[], hasDiffFunction: HasDiff<T>): boolean => { if (objects.length !== rows.length) return true; return rows.every((row, index) => { const object = objects[index]; if (row.isNew) { return false; } return !hasDiffFunction(object, row); }); };La comparación se desencadena por el valor de Angular cambiado en un ReactiveForm, no estoy seguro de si es relevante, pero aquí está:
import { isListEqualToRows } from '@core/helpers'; formGroup.valueChanges.pipe(debounceTime(debounceValue)).subscribe((changes) => { this.areChangesDetected = !isListEqualToRows<Person>(this.items, changes, this.hasDiff); }); Mi problema es que para un objeto, tengo una lista dentro de una lista. Así que estoy tratando de llamar al método isListEqualToRows() nuevamente dentro:
hasDiff(item: Person, row: any): boolean { return item.description !== row.description || !isListEqualToRows<Address>(item.addresses, row.addresses, this.hasDiffAddress); } hasDiffAddress(item: Address, row: any): boolean { return item.AddressId !== row.id || item.AddressStreet !== row.street; } Pero termino recibiendo este error mientras ejecuto la segunda línea del método hasDiff() :
No se pueden leer las propiedades de undefined (leyendo 'hasDiffAddress')
¿Cómo resolver este problema?
Está llamando a hasDiff sin this al objeto correcto. Dado que tiene habilitado el modo estricto, this a lo que se refiere hasDiff cuando se invoca fuera de una someObject.hasDiff(...) no está undefined (sin el modo estricto sería el objeto global).
En lugar de pasar this.hasDiff a isListEqualToRows , debe pasar this.hasDiff.bind(this) o (item, row) => this.hasDiff(item, row) .
Alternativamente, agregue un argumento thisArg a isListEqualToRows donde pasa this desde el alcance de la persona que llama y luego invoca hasDiffFunction como hasDiffFunction.call(thisArg, object, row) en lugar de hasDiffFunction(object, row) .
Ver también: ¿Cómo funciona la palabra clave "esto"?