加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angular – 为什么更新ControlValueAccessor时不要触发ngOnChang

发布时间:2020-12-17 18:09:25 所属栏目:安全 来源:网络整理
导读:为什么在ControlValueAccessor中“writeValue”时,ngOnChanges不会触发?我通过registerOnChange发出一些事件,但我没有看到ngOnChanges中的任何动作 const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR = new Provider( NG_VALUE_ACCESSOR,{ useExisting: forwardRe
为什么在ControlValueAccessor中“writeValue”时,ngOnChanges不会触发?我通过registerOnChange发出一些事件,但我没有看到ngOnChanges中的任何动作

const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR = new Provider(
  NG_VALUE_ACCESSOR,{
    useExisting: forwardRef(() => CustomInput),multi: true
  });

@Component({
  moduleId: module.id,selector: 'custom-input',templateUrl: 'custom-input.html',styleUrls: ['custom-input.css'],directives: [CORE_DIRECTIVES],providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR]
})
export class CustomInput implements ControlValueAccessor{

  private _text: any = '';
  public isValid:boolean = false;


  onChange: EventEmitter<any> = new EventEmitter();
  onTouched: any;


  constructor(private ngControl:NgControl) {

  }

  ngOnChanges(e) {
    console.log('ngOnChanges');
  }

  get text(): any { return this._text; };

  set text(v: any) {
    if (v !== this._text) {
      this._text = v;
      this.onChange.emit(v);
    }
  }

  writeValue(v) {
    this.text = v;
  }
  registerOnChange(fn): void {
    this.onChange.subscribe(fn);
  }
  registerOnTouched(fn): void {
    this.onTouched = fn;
  }

}

解决方法

@Input()属性更改时调用ngOnChanges.

假设您的自定义输入具有文本属性:

export class CustomInput implements OnChanges {
    @Input() text;

    ngOnChanges() {
        console.log('ngOnChanges');
    }
}

然后当someVariable发生变化时,将调用ngOnChanges:

<custom-input [text]="someVariable"></custom-input>

从组件内部进行的更改不会触发回调. ngOnChanges纯粹用于输入.

https://angular.io/guide/lifecycle-hooks#lifecycle-sequence

注意:在ngOnInit之前也会调用ngOnChanges

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读