2016-01-30 17 views
95

Come forzare il re-rendering di un componente in Angular 2? Per scopi di debug che funzionano con Redux vorrei forzare un componente a ri-renderizzare la sua vista, è possibile?Come forzare il re-rendering di un componente in Angular 2?

+0

Cosa intendi per "re-rendering". Aggiorna i binding? –

+0

Solo una rapida domanda sul motivo per cui è necessario forzare il re-rendering? –

+4

Possibile duplicato di [Rilevamento variazione trigger Triggering Angular2 manualmente] (http://stackoverflow.com/questions/34827334/triggering-angular2-change-detection-manually) – blo0p3r

risposta

138

rendering avviene dopo il rilevamento cambiamento. Per forzare il rilevamento delle modifiche, in modo che i valori delle proprietà dei componenti che sono stati modificati ottenere propagate al DOM (e quindi il browser renderanno tali modifiche nella vista), qui ci sono alcune opzioni:

  • ApplicationRef.tick() - simile a angolare 1 di $rootScope.$digest() - Vale a dire, controlla l'albero dei componenti completo
  • NgZone.run(callback) - simile a $rootScope.$apply(callback) - ad esempio, valuta la funzione di richiamata all'interno della zona Angolare 2. Penso, ma non sono sicuro, che questo finisca per controllare l'albero dei componenti completo dopo aver eseguito la funzione di callback.
  • ChangeDetectorRef.detectChanges() - simile a $scope.$digest() - vale a dire, controllare solo questo componente e dei suoi figli

È possibile iniettare ApplicationRef, NgZone, o ChangeDetectorRef nel componente.

Per il tuo scenario particolare, consiglierei l'ultima opzione se solo un singolo componente è cambiato.

+3

prova tutto di loro ma ancora non funzionano su iOS, triste – vuhung3990

+1

Qualsiasi codice funzionante su ChangeDetectorRef per la versione finale di angular2? Ora mi trovo di fronte a una situazione in cui la vista non viene aggiornata dopo la richiesta di post di un http per creare un nuovo utente e quindi in caso di successo, spingendo il nuovo oggetto alla precedente userlist esistente (utilizzata per iterare in vista). Abbastanza strano che "questa è la prima volta che sto affrontando un aggiornamento che non funziona in ng2'. La strategia di rilevamento delle modifiche è predefinita, quindi so che non ho incasinato la strategia di rilevamento delle modifiche. – Gary

+0

@Gary, dovresti pubblicare una nuova domanda e includere il tuo componente e il tuo codice di servizio (idealmente, includere un plunker minimale che dimostri il problema). Un problema comune che ho visto non sta usando il corretto contesto 'this' nel callback POST. –

33

tx, trovato la soluzione che serviva:

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

zone.run esecuzione forzerà il componente di ri-rendering

+3

cos'è appStore in questo contesto - quale tipo di variabile e il suo tipo? sembra essere osservabile ... ma il mio osservabile è all'interno del componente che voglio aggiornare con un clic di un pulsante ... e non so come accedere a un metodo/variabile del componente figlio dalla posizione padre/corrente –

Problemi correlati