Angular2订阅Child Component中对@Input的更改

时间:2016-07-20 00:25:52

标签: angular

我有一个父子组件。父组件具有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) {
    }



}

4 个答案:

答案 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++;
  }
}

Plunker:http://plnkr.co/edit/XjD1jjCnqiFdbhpTibIe

答案 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

更新:父组件中的indexstring。由于某种原因,它在子组件中变为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);
}