检测由父角度2触发的子组件变量的变化

时间:2017-01-19 16:14:37

标签: angular eventemitter angular2-changedetection

我有2个文件。 app.ts和Child.ts

我正在从app向child发送一个变量,我想检测变量中的任何变化并相应地显示数据。我无法检测到变量的变化。

任何帮助?我附上了Plunker Link,我还在评论

中解释了我想在Child.ts文件中做什么

App.ts文件

//our root app component
import {Component, NgModule} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import {ChildCom} from './child.ts'

@Component({
    selector: 'my-app',
    template: `
    <div>
        <h2>Hello</h2>
        <child-com newdata={{data}}></child-com>
    </div>
    `,
})
export class App {
    data: any = [];

      constructor(){
          this.data = [{"name":"control","status":"false"}];
    }
}

@NgModule({
    imports: [ BrowserModule ],
    declarations: [ App, ChildCom ],
    bootstrap: [ App ]
})
export class AppModule {}

Child.ts文件

import {Component, Input} from '@angular/core';

@Component({
  selector: 'child-com',
  template: `
    <div>
      <p>Controls: {{newdata}}</p>
    </div>
  `,
})

export class ChildCom {
  @Input() newdata: any = [];

  constructor(){
  }

  // here I want to check if value of control in newdata variable is false 
  // then display message on front end "your controls are not working"
  // if value of control in newdata variable is true
  // then display message on front end "your controls are working fine."
  // this should automatically happen whenever I change the value of newdata variable
}

Plunker Link

3 个答案:

答案 0 :(得分:11)

您可以newData设置定位器,也可以实现OnChanges

export class ChildCom {
  private _newdata: any = [];
  @Input() 
  set newdata(value) {
    // code here
  }
}
export class ChildCom implements OnChanges {
  @Input() set newdata(: any = [];

  ngOnChanges(changes) {
    // code here
  }
}

https://angular.io/docs/ts/latest/api/core/index/OnChanges-class.html

<强>暗示

newdata={{data}}

很好,但只支持字符串值

[newdata]=data

支持所有类型的值。

以下是更新的plnkr的链接,以解释相同的https://plnkr.co/edit/5ahxWJ?p=preview

答案 1 :(得分:1)

某些代码更改可以完成同样的工作。

1)提供newData作为输入,不要使用插值将数据传递给子组件。

<child-com [newdata]="data"></child-com>

2)检测变化的两种简单方法是@Gunter建议的ngOnChanges或使用rxjs Observable订户模型,很容易就是ngOnChanges。这是你使用相同的修改过的plunkr。 https://plnkr.co/edit/5ahxWJ?p=preview

答案 2 :(得分:-1)

您必须像这样进行绑定:

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://my.website.com/TheClass"
  , elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED
  , location = "http://my.website.com/TheClass TheClass.xsd"
)
package com.mypackage.beans;

对于组件之间的通信,这是一个非常好的资源:

https://angular.io/docs/ts/latest/cookbook/component-communication.html

您要找的是:通过输入绑定将数据从父级传递给子级