Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

190
Views
No se pueden leer las propiedades de undefined al encadenar métodos

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?

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

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"?

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!