我有一个父子组件。父组件具有index
,并将其作为@Input
传递给子组件。这个index
值在父组件中不断变化,而在我的子组件中,我想在每次父组件更改index
时运行一个函数。这有一个不断更改它的幻灯片组件。我怎样才能做到这一点?我已尝试使用以下代码(this.index.subscribe(() =>
),但我发现每次尝试初始化订阅时它都不是函数。
编辑:Child
模板中没有可能影响此问题的相关代码,因此未提供。 ngOnChange
似乎无法正常工作,因为指令中发生的更改与parent
模板相反。
子:
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();
}
}
父:
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) {
}
}
答案 0 :(得分:40)
https://angular.io/docs/ts/latest/api/core/index/Input-var.html
引用:
Angular会在更改期间自动更新数据绑定属性 检测
如果您需要对输入进行一些处理,请查看get和set。 https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#parent-to-child-setter
从文档中,这是一个例子。
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; }
}
您不需要使用可观察物。
答案 1 :(得分:17)
如其他答案中所述,您可以使用ngOnChanges
生命挂钩。来自Angular的documentation:
ngOnChanges:在Angular设置数据绑定输入属性后响应。 该方法接收当前值和先前值的更改对象。
请查看以下示例,了解如何使用它:
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++;
}
}
答案 2 :(得分:10)
ngOnChange
。您甚至可以在Child
组件中使用它,但它未正确实现:
ngOnChanges(changes: {[propertyName: string]: SimpleChange}) {
// check the object "changes" for new data
}
更多详情:https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#onchanges
更新:父组件中的index
为string
。由于某种原因,它在子组件中变为Observable
。
答案 3 :(得分:2)
将变化的值“转换”为可观察值的另一种解决方案应该是
@Input() status: Status;
private status$: Subject<Status>;
constructor() {
this.status$ = new Subject<Status>();
}
ngOnChanges(changes: {[propertyName: string]: SimpleChange}) {
this.status.next(this.status);
}