2015-07-23 35 views
11

Supponiamo che io sono semplice componente Angular2Segnalatemi componente figlio cambiamenti in Angular2

@Component({ selector: 'parent' }) 
@View({ 
    template: ` 
     <p>Parent {{ data }}</p> 
     <child [model]="data"></child> 
    `, 
    directives : [Child] 
}) 
export class Parent { 
    data: number = 42; 
} 

come si può vedere che usa un altro semplice componente

@Component({ 
    selector: 'child', 
    properties : ['model'] 
}) 
@View({ 
    template: ` 
     <p>Child {{ model }}</p> 
    `, 
}) 
export class Child { 
    model: number; 
} 

sto passando model dal componente parent al child attraverso la sintassi [property] dell'angolare per l'associazione dati. Quindi, se voglio tenere traccia delle modifiche di nel parent, posso facilmente aggiungere un evento allo child e tramite la sintassi (event) le modifiche nel "genitore". Quindi, come posso implementare la situazione opposta quando parent cambia model e child vuoi essere avvisato?

+0

se il genitore cambia il modello, il bambino riceverà il nuovo valore tramite l'associazione, quindi non c'è nulla di speciale necessaria per il genitore di inviare un nuovo valore per il bambino diverso da quello –

+1

Sì, lo sarà, ed è sufficiente se ho bisogno solo di visualizzare i dati. Ma cosa succede se ho bisogno di aggiungere qualche logica aggiuntiva per la modifica dei dati? Ricalcola qualcosa o fai una richiesta http e così via. Questo è il caso in cui $ watch aiuta nell'angolare 1. –

risposta

6

Si può mettere la logica aggiuntiva o calcoli in onChange metodo, che si chiama, dopo tutte le proprietà bound del componente sono aggiornati.

@Component({ 
    selector: 'child', 
    properties : ['model'] 
}) 
@View({ 
    template: ` 
     <p>Child {{ model }}</p> 
    `, 
}) 
class Child { 
    model: number; 

    onChange(map){ 
     if(map.model) { 
     console.log('doing crazy stuff here'); 
     console.log(map.model); //SimpleChange {previousValue: 43, currentValue: 44} 
     } 
    } 
} 

Plunker

+0

In Angular 2.1.1 questo sembra non funzionare più. Anche Plunkr sembra rotto. – rmcsharry

9

È possibile utilizzare getters e setters per gestirlo. Per il vostro esempio Child componente deve essere guardato come questo:

@Component({ 
    selector: 'child', 
    properties : ['model'] 
}) 
@View({ 
    template: ` 
    <p>Child {{ model }}</p> 
    `, 
}) 
class Child { 
    _model: number; 

    set model(newModelValue) { 
    // Here we are 
    console.log('new model value: ' + newModelValue) 
    this._model = newModelValue; 
    } 

    get model() { 
    return this._model; 
    } 
} 

Ecco la plunker per il vostro caso

+0

Mi piace questa soluzione. Pensi che sarà una pratica comune per questi casi per angular2? –

+0

Bene, se si desidera eseguire il pre-elaborazione del valore 'model', penso che la scelta migliore sia usare le pipe. '{{modello | pipe1 | pipe2}} '- è un modo più conciso e dichiarativo. Ma forse per alcune situazioni più complesse l'approccio di getter/setter sarà buono. – alexpods

+1

alexpods, non hai dimenticato @Input()? – Anton

Problemi correlati