2015-07-23 9 views
11

Angenommen, ich habe einfach Angular2 KomponenteKind Komponente über Änderungen in Angular2 diesen Artikel

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

, wie Sie es verwendet eine andere einfache Komponente

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

I model zum child von der parent Komponente bin vorbei sehen können durch die Winkels [property] Syntax für Datenbindung. Also, wenn ich einige Änderungen von model in der parent verfolgen möchte, kann ich einfach Ereignis zur child hinzufügen und durch die (event) Syntax die Änderungen in der "Eltern" verfolgen. Also, wie kann ich die umgekehrte Situation implementieren, wenn parent Änderungen model und child möchten benachrichtigt werden?

+0

, wenn die Eltern sich das Modell ändern, wird das Kind den neuen Wert über die Bindung erhalten, so gibt es nichts Besonderes, die für die Eltern einen neuen Wert für das Kind anders als die –

+1

zu schicken Ja, wird es, und es ist genug, wenn ich nur Daten anzeigen muss. Aber was, wenn ich eine zusätzliche Logik für die Datenänderung hinzufügen muss? Neuberechnen Sie etwas oder machen Sie HTTP-Anfrage usw. Dies ist der Fall, wenn $ Uhr in Winkel 1 hilft. –

Antwort

6

Sie können Ihre zusätzliche Logik oder Berechnungen in onChange Methode setzen, dass, nachdem alle Komponenten des gebundenen Eigenschaften genannt wird sind aktualisiert.

@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 scheint dies nicht mehr zu funktionieren. Plunkr scheint auch gebrochen zu sein. – rmcsharry

9

Sie können getters und setters verwenden, um es zu verwalten. Für Ihr Beispiel Child Komponente muss so ausgesehen werden:

@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; 
    } 
} 

Hier ist die plunker für Ihren Fall ist

+0

Ich mag diese Lösung. Denken Sie, dass es in solchen Fällen für angular2 üblich ist? –

+0

Nun, wenn Sie nur den "Modell" -Wert vorverarbeiten möchten, ist die beste Wahl, Rohre zu verwenden. '{{Modell | pipe1 | pipe2}} '- es ist prägnanter und deklarativer Art. Aber vielleicht wird Getter/Setter für etwas komplexere Situationen gut sein. – alexpods

+1

alexpods, hast du @Input() nicht vergessen? – Anton