【问题标题】:ReBuild/Re-render Angular2 component when property is changed更改属性时重新构建/重新渲染 Angular2 组件
【发布时间】:2016-09-07 21:08:45
【问题描述】:

如何实现?

我的子组件

 import {Component,Input,ngOnInit} from 'angular2/core';

@Component({
selector: 'my-component',
template: `
    <div>In child component - myAttr = {{ myAttr1 }}</div>
`
})
export class MyComponent  {
  @Input() myAttr: number;
  myAttr1:number;
 ngOnInit()
 {
  this.myAttr1=this.myAttr*10;
 }

}

主要组件

import {Component} from 'angular2/core';
import {MyComponent} from './sub.component';

@Component({
selector: 'my-app',
template: `
    <my-component
        [(myAttr)]="myAttr"
    ></my-component>
    <button (click)="onClick()">Click</button>
`,
directives: [MyComponent]
})
export class AppComponent {
   myAttr: number = 1;

  onClick() {
    console.log('Click in the parent component');
    this.myAttr += 1;
  }
}

我需要更新每次点击的值。应该有直接的方法,否则 Angular2 团队应该考虑这个

【问题讨论】:

    标签: properties angular components


    【解决方案1】:

    您应该使用 ngOnChanges 来检测 myAttr 何时在您的子组件中更新:

    @Component({
      selector: 'my-component',
      template: `
        <div>In child component - myAttr = {{ myAttr1 }}</div>
      `
    })
    export class MyComponent  {
      @Input() myAttr: number;
      myAttr1:number;
      ngOnInit() {
        this.myAttr1=this.myAttr*10;
      }
    
      ngOnChanges() { // <------
        this.myAttr1=this.myAttr*10;
      }
    }
    

    这允许检测myAttr 输入属性何时更新并相应地更新myAttr1 之一。

    看到这个 plunkr:https://plnkr.co/edit/2SOdq7w3s8iDxBKbiLpU?p=preview

    【讨论】:

    • 是的。我找到。因为这是一个简单的例子,我们可以实现。
    • Property 有两种方式的绑定选项吗?
    • 对于双向绑定,您需要添加一个@Output,其名称带有前缀:Change。例如:@Output() myAttrChange:EventEmitter&lt;number&gt; = new EventEmitter();。您需要使用其emit 方法从中触发事件。这允许您使用以下语法:[(myAttr)]="myAttr".