angular2-questionnaire icon indicating copy to clipboard operation
angular2-questionnaire copied to clipboard

关于questionnaire-item.component的ngOnChanges

Open clfeng opened this issue 7 years ago • 5 comments

github上代码

  ngOnChanges(changes: SimpleChanges){
      let questionnaireChange = changes['questionnaire'];
      if(questionnaireChange.previousValue.state && 
            questionnaireChange.currentValue.state !== questionnaireChange.previousValue.state){
          this.questionnaire = changes['questionnaire'].currentValue;
          this.setState();
      }
  }

官网PAI


class SimpleChange {
constructor(previousValue: any, currentValue: any, firstChange: boolean)
previousValue : any
currentValue : any
firstChange : boolean
isFirstChange() : boolean
}

通过changes为SimpleChanges的一个对象实例,那么应该不具有questionnaire方法吧?表示那不大理解,像老师请教一下。

clfeng avatar Jun 21 '17 13:06 clfeng

changes 是一个 SimpleChanges 类型对象,changes 里面有 questionnaire 这个 SimpleChange 类型的子对象,注意"s"结尾的区别。 questionnaire 是一个对象,不是一个方法

ghost avatar Jun 22 '17 01:06 ghost

老师说还没注意到有没‘s’,谢谢啦。然后后来自己也debugger了一下,现在比较明白了。然后里面的github的代码存在着这么一个bug:

  ngOnChanges(changes: SimpleChanges){
      let questionnaireChange = changes['questionnaire'];
      if( questionnaireChange.previousValue.state && 
            questionnaireChange.currentValue.state !== questionnaireChange.previousValue.state){
          this.questionnaire = changes['questionnaire'].currentValue;
          this.setState();
      }
  }

这段代码中,当第一次调用到ngOnChanges的时候questionnaireChange.previousValue为undefined,所以调用questionnaireChange.previousValue.state会报错,感觉原本的代码意图应该是

if( questionnaireChange.previousValue&& 
            questionnaireChange.currentValue.state !== questionnaireChange.previousValue.state)

还有一点想请教下。changes所拥有对象的名称是根据@Input来判断的?理由是OnChanges是用来在@Input的值变化时调用的钩子?不知怎么理解对不对

clfeng avatar Jun 22 '17 06:06 clfeng

恩,谢谢反馈问题。

ghost avatar Jun 22 '17 07:06 ghost

OnChanges的参数值是根据@Input定义的,当@Input() 修饰的变量发生变化就会触发 OnChanges钩子

ghost avatar Jun 22 '17 07:06 ghost

想明白了。谢谢

clfeng avatar Jun 22 '17 07:06 clfeng