我在使用角度形式值访问器时遇到了大麻烦。
查找第一个父组件和嵌套子组件
测试就像一个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是否有一个";解析";定位的方法或方法