Angular 的控制值访问器还是没有绑定值?



我在使用角度形式值访问器时遇到了大麻烦。

查找第一个父组件和嵌套子组件

测试就像一个var:

test: any = '';

现在的子组件:"@angular/forms";

@Component({ 
....
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => Test),
multi: true
}
]
})
export class Teste implements ControlValueAccessor {

}

这应该是可行的,但当我console.log我的"test"变量时,我得到了未定义或空字符串。。

错误在哪里?

dateTime发生变化时,需要调用dateValueChanged。你可以做到"分割";[ngModel](ngModelChange)中的[(ngModel)]
<input type="text" [ngModel]="dateTime" 
(ngModelChange)="dateTime=$event;dateValueChanged()" 
bsDatepicker>

更新如果我们想改进传递标签或占位符的自定义组件,我们可以使用@Input(或attribute(

仅使用输入,在组件中

@Input()placeHolder;
@Input()label;
{{label}}
<input type="text" [attr.placeholder]="placeholder" [ngModel]="dateTime" 
(ngModelChange)="dateTime=$event;dateValueChanged()" 
bsDatepicker>

使用Attribute它只在构造函数中使用

constructor(@Optional() @Attribute('placeholder') private placeholder:string,
@Optional() @Attribute('label') private label:string
){}

一般来说,如果我们不打算改变;标签";也不是";占位符";它更喜欢使用第二种方法。

Update2好吧,如果我们希望我们的自定义formControl收到一个";字符串";并返回一个"0";字符串";我们需要使用函数writeValue和dateValueChanged

writevalue接收formControl的值,我们收到了一个字符串,但我们需要dateTime是一个日期

我们可以使用moment或类似的函数:

//received a "string", need this.dateTime was a Date object
writeValue(input: string) {
const parts=input?input.match(/d+/g):null
if (parts && parts.length==3)
this.dateTime=new Date(+parts[2],(+parts[1])-1,+parts[0])
else
this.dateTime=new Date();
}

在dateValueChanged中,我们可以制作

dateValueChanged(): void {
const data=("00"+this.dateTime.getDate()).slice(-2)+"-"+
('00'+(this.dateTime.getMonth()+1)).slice(-2)+"-"+
this.dateTime.getFullYear()
this.onChange(data);
}

注意:它只是一个";例如";,我不知道bsDatePicker是否有一个";解析";定位的方法或方法

最新更新