detect change of nested property for component input

后端 未结 2 1081
谎友^
谎友^ 2020-12-03 23:47

In a simplified way I have an Angular2 Component and an input object like this:

class MyObject{
 Prop1:string;
 Prop2:Number;
}  

@Component() 
export class         


        
2条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-03 23:57

    In fact, by default Angular2 detects changes when object reference is updated not its content. But this default behavior can be changed by using the DoCheck interface.

    In your case (detecting that a property was updated into the myObject object, you could use the following approach:

    @Component({
      selector: 'my-component',
      (...)
    }) 
    export class MyComponent implements DoCheck {
      @Input() myObject: MyObject;
      differ: any;
    
      constructor(differs:  KeyValueDiffers) {
        this.differ = differs.find([]).create(null);
      }
    
      ngDoCheck() {
        var changes = this.differ.diff(this.myObject);
    
        if (changes) {
          changes.forEachChangedItem((elt) => {
            if (elt.key === 'prop1') {
              this.doSomethingIfProp1Change();
            }
          });
        }
      }
    
      doSomethingIfProp1Change() {
        console.log('doSomethingIfProp1Change');
      }
    }
    

    When the value of the prop1 property is updated, the doSomethingIfProp1Change method is called.

    See this plunkr: http://plnkr.co/edit/uvOKMXQa9Ik8EiIhb60Y?p=preview.

提交回复
热议问题