【发布时间】: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
【问题讨论】:
-
@Input()是一种单向数据绑定。要更改您孩子的父数据,您需要通过@Output()进行双向数据绑定。请阅读答案here。
标签: angular angular-ngmodel ngmodel controlvalueaccessor