Ik heb een ouder- en een kindcomponent. Bovenliggende component heeft index
en geeft deze door aan de onderliggende component als een @Input
. Deze waarde van index
verandert voortdurend in de bovenliggende component, en binnen mijn onderliggende component wil ik een functie uitvoeren telkens wanneer de bovenliggende component index
verandert. Dit heeft een dia-component die deze constant verandert. Hoe kan ik dit bereiken? Ik heb het geprobeerd met de onderstaande code (this.index.subscribe(() =>
), maar ik begrijp dat het niet elke keer een functie is als ik het abonnement probeer te initialiseren.
EDIT: er is geen gerelateerde code in de Child
-sjabloon die hierop van invloed kan zijn, dus deze wordt niet verstrekt. ngOnChange
lijkt niet te werken omdat de wijziging plaatsvindt in de richtlijn in tegenstelling tot de sjabloon van de parent
.
Kind:
import {Component, OnInit, ViewChild, Input} from '@angular/core';
import {Observable} from 'rxjs/Observable';
@Component({
selector: "child",
templateUrl: "components/child/child.html",
})
export class ChildComponent implements OnInit {
@Input() index: string;
currentIndex: any;
constructor() {}
ngOnInit() {}
ngOnChanges(){}
ngAfterViewInit() {
console.log("index " + this.index);
this.currentIndex = this.index.subscribe(() => {
console.log("index " + this.index);
})
}
ngOnDestroy() {
this.currentIndex.unsubscribe();
}
}
Ouder:
import {Component, ElementRef, OnInit, ViewChild} from '@angular/core';
import {Page} from "ui/page";
import {ChildComponent} from '/components/child/child.component'
@Component({
selector: "parent",
template: "<child [index]="index"></child>",
directives: [ChildComponent]
})
export class ParentComponent implements OnInit {
index: string = "0,1";
constructor(private page: Page) {
}
}
Antwoord 1, autoriteit 100%
https://angular.io/docs/ ts/latest/api/core/index/Input-var.html
Om te citeren:
Angular werkt gegevensgebonden eigenschappen automatisch bij tijdens wijziging
detectie.
Als je wat bewerkingen op de invoer moet doen, kijk dan naar de get en set.
https://angular.io /docs/ts/latest/cookbook/component-communication.html#!#parent-to-child-setter
Hier is een voorbeeld uit de documentatie.
import { Component, Input } from '@angular/core';
@Component({
selector: 'name-child',
template: `
<h3>"{{name}}"</h3>
`
})
export class NameChildComponent {
_name: string = '<no name set>';
@Input()
set name(name: string) {
this._name = (name && name.trim()) || '<no name set>';
}
get name() { return this._name; }
}
U hoeft geen waarneembaar bestand te gebruiken.
Antwoord 2, autoriteit 38%
Zoals vermeld in het andere antwoord, kunt u ngOnChanges
life hook gebruiken. Uit de documentatievan Angular:
ngOnChanges: Reageer nadat Angular een gegevensgebonden invoereigenschap heeft ingesteld.
De methode ontvangt een wijzigingsobject van huidige en vorige waarden.
Bekijk het onderstaande voorbeeld om te zien hoe u het kunt gebruiken:
import { Component, Input, OnChanges } from '@angular/core';
@Component({
selector: 'child',
template: `
Value:
<span>{{ value }}</span>
<br />
<br />
Number of changes: {{ numberOfChanges }}
`
})
export class ChildComponent implements OnChanges {
@Input() value: any;
private numberOfChanges: number = 0;
ngOnChanges() {
this.numberOfChanges++;
}
}
Plunker: http://plnkr.co/edit/XjD1jjCnqiFdbhpTibIe
Antwoord 3, autoriteit 22%
ngOnChange
wordt aangeroepen telkens wanneer een invoerparameter verandert. Je hebt het zelfs in je Child
-component, maar het is niet correct geïmplementeerd:
ngOnChanges(changes: {[propertyName: string]: SimpleChange}) {
// check the object "changes" for new data
}
Meer details: https://angular.io /docs/ts/latest/guide/lifecycle-hooks.html#!#onchanges
Update: index
in de bovenliggende component is een string
. Om de een of andere reden werd het een Observable
in de onderliggende component.
Antwoord 4, autoriteit 5%
Een andere oplossing voor het “transformeren” van de veranderende waarde in een waarneembare zou moeten zijn
@Input() status: Status;
private status$: Subject<Status>;
constructor() {
this.status$ = new Subject<Status>();
}
ngOnChanges(changes: {[propertyName: string]: SimpleChange}) {
this.status.next(this.status);
}