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

279
Visualizações
¿Por qué en mi aplicación Angular que usa mecanografiado, no está cambiando mi variable dentro de una función en esta situación?

Tengo un problema extraño.

En mi componente CategoryComponent tengo una variable en alcance que es:

@Input() categoría: CategoríaModelo;

Cuando hago una publicación simple con un servicio y devuelvo datos, cambio esta variable para cambiar, así que hago una función que hace esto:

 if (category.uploading) { this.checkMedia(this.category, this.module); }

Dentro de mi función hago esto:

 checkMedia(model: any, module: String) { let counter = 0; var refreshIntervalId = setInterval(() => { const service = model instanceof CategoryModel ? this.categoryService : this.foodService; service .hasMedia(model) .pipe( switchMap((hasMedia) => { if (hasMedia) { return service.show(model, module); } return of(undefined); }), catchError((_) => { clearInterval(refreshIntervalId); return of(undefined); }) ) .subscribe( (newModel) => { if (newModel) { if(newModel.hasMedia) { model.hasMedia = newModel.hasMedia; model.images = newModel.images; model.uploading = false; console.log(model); console.log(this.category); clearInterval(refreshIntervalId); this.cd.detectChanges(); } } }, (_) => { clearInterval(refreshIntervalId); } ); counter++; if (counter == 3) { if (refreshIntervalId) { model.uploading = false; clearInterval(refreshIntervalId); this.cd.detectChanges(); } } }, 8000); }

Por qué en esta parte:

 model.hasMedia = newModel.hasMedia; model.images = newModel.images; model.uploading = false; console.log(model); console.log(this.category); clearInterval(refreshIntervalId); this.cd.detectChanges();

Mi pantalla cambia solo si hago referencia a esta variable directamente como this.category.name = "TESTE"; , por ejemplo, pero cuando uso con el modelo de parámetro: cualquiera , cambia la variable global cuando veo en console.log() pero en mi página principal el estado que quiero no cambia ¿por qué?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

LA PREOCUPACIÓN PRINCIPAL

La parte que no entiendo, ¿qué estás haciendo con el modelo? ¿Por qué no estás usando this.model ? Esperaría que hiciera referencia al modelo en su HTML en algún lugar y, por lo tanto, necesitaría actualizar una variable miembro de clase this.model = {blah-blah-blah} . ¿Ha declarado un modelo de propiedad pública en algún lugar de su clase? ¿Por qué no se actualiza? En tu clase necesitas declarar:

 @Input() category: CategoryModel; model: any;

Y luego en tu código:

 this.model = something

Y luego en tu html:

 {{ model | json }}

OTROS PROBLEMAS POTENCIALES

¿Qué estrategia de detección de cambios está utilizando? OnPush o por defecto? No debe usar OnPush a menos que esté seguro de ello. Es posible que debido a que está mutando la detección de cambio de modelo no se active. Debe evitar la mutación de objetos. Para solucionar esto, intente agregar esta línea:

 model.hasMedia = newModel.hasMedia; model.images = newModel.images; model.uploading = false; model = {...model}; // creates a new object reference which will cause Angular change detection to kick in

O

 import {cloneDeep} from 'lodash-es'; model.hasMedia = newModel.hasMedia; model.images = newModel.images; model.uploading = false; model = cloneDeep(model); // creates a new object reference which will cause Angular change detection to kick in

Encuentro el segundo enfoque más legible. Déjame saber si funciona. Mis mejores deseos.

Esto es mutación (MALO):

 model.hasMedia = newModel.hasMedia; model.images = newModel.images; model.uploading = false;

Esto no es mutación (BUENO):

 model = { ...model hasMedia: newModel.hasMedia; images: newModel.images; uploading: false; }

EDITAR... USANDO VALORES DEVUELTOS

 this.checkMedia(this.category, this.module).then((cat) => { this.category = cat; });

y devolver un valor de checkMedia

 checkMedia(model: any, module: String): Promise<any> { return new Promise((resolve) => { // your existing code resolve(model) }) }
over 4 years ago · Santiago Trujillo 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