【问题标题】:ControlValueAccessor ngModel not updated when event changed value事件更改值时未更新 ControlValueAccessor ngModel
【发布时间】:2021-06-02 02:55:18
【问题描述】:

我有一个组件,它使用 controlvalueaccessor 来绑定从父组件传递的 ngModel

password.component.ts:

     import {
  Component,
  ElementRef,
  forwardRef,
  HostListener,
  Input,
  OnChanges,
  OnInit,
  SimpleChanges
} from "@angular/core";
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from "@angular/forms";
export const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR: any = {
  provide: NG_VALUE_ACCESSOR,
  useExisting: forwardRef(() => PasswordComponent),
  multi: true
};
@Component({
  selector: "app-password-input",
  templateUrl: "./password.component.html",
  styleUrls: ["./password.component.scss"]
})
export class PasswordComponent
  implements OnInit, ControlValueAccessor, OnChanges {
  _model: string;
  @Input() depended: string = "";
  @Input() name: string = "password";
  @Input() id: string = "password";
  @Input() class: string = "form-control";
  @Input() placeholder: string = "";
  @Input() required:boolean;

  setPassword(event) {
    this.writeValue(event);
  }

  changeModel() {
    this.model = "aaaa";
  }
 change(event){
    console.log("event",event);
    
  }
  constructor() {}
  ngOnChanges(changes: SimpleChanges): void {}
  ngOnInit(): void {}

  get model() {
    return this._model;
  }

  set model(val) {
    this._model = val;
    this.propagateChange(this._model);
  }

  writeValue(value: any) {
    if (value !== undefined) {
      this.model = value;
    }
  }

  propagateChange = (_: any) => {};

  registerOnChange(fn: any): void {
    this.propagateChange = fn;
  }

  registerOnTouched(fn: any): void {}

  setDisabledState?(isDisabled: boolean): void {}
}

而吹线是我的password.component.html:

<div>
  <label for="password"
    >pass
    <small class="text-danger">*</small>
  </label>
  <div class="input-group mb-2">
    <input
      [class]="class"
      [id]="id"
      name="name"
      [(ngModel)]="model"
      #models="ngModel"
      (ngModelChange)="change($event)"
      [required]="required"
      [placeholder]="placeholder"
    />
    <div class="input-group-prepend">
      <button class="btn  rounded-0" (click)="changeModel()" type="button">
        change
      </button>
    </div>
  </div>
  in child component: {{model}}
</div>

下面是我的父组件:

<app-password-input [(ngModel)]='password' name="password" ngDefaultControl></app-password-input>
out:
{{password}}

我的问题是,当我使用触发密码组件中changeModel 的按钮更改输入时,密码组件中的模型正在更新,但值不影响父组件中的model.password

stack blitz link

【问题讨论】:

  • @Input() 是一种单向数据绑定。要更改您孩子的父数据,您需要通过@Output() 进行双向数据绑定。请阅读答案here。

标签: angular angular-ngmodel ngmodel controlvalueaccessor


【解决方案1】:

您需要向自定义组件提供 NG_VALUE_ACCESSOR 令牌才能正常绑定工作

@Component({
  selector: "app-password-input",
  templateUrl: "./password.component.html",
  styleUrls: ["./password.component.scss"],
  providers:[CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR]
})

Forked Working Example

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2019-01-30
    • 2017-09-16
    • 1970-01-01
    • 2021-01-25
    • 2013-06-22
    • 2020-05-18
    • 2018-06-02
    相关资源
    最近更新 更多