pasar parametros otro enviar entre ejemplo datos comunicacion componentes componente change angular angular2-changedetection

parametros - pasar datos de un componente a otro angular 2



¿Cómo forzar la re-representación de un componente en Angular 2? (5)

El renderizado ocurre después de la detección de cambios. Para forzar la detección de cambios, de modo que los valores de las propiedades de los componentes que han cambiado se propaguen al DOM (y luego el navegador mostrará esos cambios en la vista), estas son algunas opciones:

  • ApplicationRef.tick() - similar al $rootScope.$digest() Angular 1. $rootScope.$digest() - es decir, verifique el árbol de componentes completo
  • NgZone.run(callback) : similar a $rootScope.$apply(callback) , es decir, evalúa la función de devolución de llamada dentro de la zona Angular 2. Creo, pero no estoy seguro, que esto termina comprobando el árbol de componentes completo después de ejecutar la función de devolución de llamada.
  • ChangeDetectorRef.detectChanges() - similar a $scope.$digest() - es decir, verifique solo este componente y sus elementos secundarios

Deberá importar y luego inyectar ApplicationRef , NgZone o ChangeDetectorRef en su componente.

Para su escenario particular, recomendaría la última opción si solo un componente ha cambiado.

¿Cómo forzar la re-representación de un componente en Angular 2? Para fines de depuración que trabajen con Redux, me gustaría obligar a un componente a volver a representar su vista, ¿es eso posible?


Enfoque ChangeDetectorRef

import { Component, OnInit, ChangeDetectorRef } from ''@angular/core''; export class MyComponent { constructor(private cdr: ChangeDetectorRef) { } selected(item: any) { if (item == ''Department'') this.isDepartment = true; else this.isDepartment = false; this.cdr.detectChanges(); } }


Obligo a recargar mi componente usando * ngIf.

Todos los componentes dentro de mi contenedor vuelven a los ganchos de ciclo de vida completo.

En la plantilla:

<ng-container *ngIf="_reload"> components here </ng-container>

Luego en el archivo ts:

public _reload = true; private reload() { setTimeout(() => this._reload = false); setTimeout(() => this._reload = true); }


Otras respuestas aquí proporcionan soluciones para desencadenar ciclos de detección de cambios que actualizarán la vista del componente (que no es lo mismo que el renderizado completo).

El renderizado completo, que destruiría y reinicializaría el componente (llamando a todos los ganchos del ciclo de vida y la vista de reconstrucción) se puede hacer usando ng-template , ng-container y ViewContainerRef de la siguiente manera:

<div> <ng-container #outlet > </ng-container> </div> <ng-template #content> <child></child> </ng-template>

Luego, en el componente que hace referencia tanto a #outlet como a #content , podemos borrar el contenido de los puntos de venta e insertar otra instancia del componente secundario:

@ViewChild("outlet", {read: ViewContainerRef}) outletRef: ViewContainerRef; @ViewChild("content", {read: TemplateRef}) contentRef: TemplateRef<any>; private rerender() { this.outletRef.clear(); this.outletRef.createEmbeddedView(this.contentRef); }

Además, el contenido inicial debe insertarse en el gancho AfterContentInit :

ngAfterContentInit() { this.outletRef.createEmbeddedView(this.contentRef); }

La solución de trabajo completa se puede encontrar aquí https://stackblitz.com/edit/angular-component-rerender .


tx, encontré la solución que necesitaba:

constructor(private zone:NgZone) { // enable to for time travel this.appStore.subscribe((state) => { this.zone.run(() => { console.log(''enabled time travel''); }); });

ejecutar zone.run forzará al componente a volver a renderizar