Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

185
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda