- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我开始之前,我使用 Angular2 rc4 和 typescript 。如果您想知道,我还不能升级,所以我必须在 rc4 的约束下完成这项工作。此外,我是一个 ng2 菜鸟,所以我仍然在思考概念和“候选发布”之间的所有变化。
在对值访问器进行了大量研究之后,我决定专门为 <input type=date />
创建一个以避免在组件中需要一个单独的 mule 属性来将日期转换为输入字符串。
我找到了 this gist ,这似乎做了很多我想做的事情。
以此为起点,几乎是终点,我想出了这个:
import { Directive, ElementRef, Renderer, forwardRef } from "@angular/core";
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from "@angular/forms";
import { isBlank, isDate } from "@angular/forms/src/facade/lang";
import moment from "moment";
export const DATE_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DateValueAccessor),
multi: true
};
@Directive({
selector:
"input[type=date][formControlName],input[type=date][formControl],input[type=date][ngModel]",
host: {
"(change)": "onChange($event.target.value)",
"(input)": "onChange($event.target.value)",
"(blur)": "onTouched()"
},
providers: [DATE_VALUE_ACCESSOR]
})
export class DateValueAccessor implements ControlValueAccessor {
onChange = (_: any) => {
// we don't need to do anything here
};
onTouched = () => {
// we don't need to do anything here
};
constructor(
private _renderer: Renderer,
private _elementRef: ElementRef) {
}
writeValue(value: any): void {
var normalizedValue: string = isBlank(value) ? "" : (isDate(value) ? moment(value).format("YYYY-MM-DD") : "");
this._renderer.setElementProperty(this._elementRef.nativeElement, "value", normalizedValue);
}
registerOnChange(fn: (_: any) => void): void {
this.onChange = (value: string) => {
var date: moment.Moment = moment(value, "YYYY-MM-DD");
var newValue: Date = date.isValid() ? date.toDate() : undefined;
fn(newValue);
};
}
registerOnTouched(fn: () => void): void {
this.onTouched = fn;
}
}
我觉得我快到了,但还不完全是!
更新 首次加载表单时,一切都很正常,但当我尝试选择新日期时,浏览器会提示格式问题。 /更新
我在我的开发工具中看到的错误是:
The specified value "Fri Sep 09 2016 00:00:00 GMT+0100 (GMT Summer Time)" does not conform to the required format, "yyyy-MM-dd".
我花了一些时间来调整代码和移动东西。我也试过调用 writeValue
从里面onChange
( as can be seen in this plnkr ),但我仍然看到错误...
有人做过吗?我的代码中是否有明显遗漏的内容?
最佳答案
不可否认,使用的是更新版本的 Angular (2.1.0),但更改应该适用,您可以看到模型正确绑定(bind)到您的格式化字符串,这是一个 Plunker:https://plnkr.co/edit/8U0o0m49646tMH0kr1Mx?p=preview
您的代码唯一的变化是:
registerOnChange(fn: (_: any) => void): void {
this.onChange = fn;
}
这没有显示文本变化,据我所知,它作为元素绑定(bind)到输入 type="date"并且不能被覆盖。快速搜索将我带到 Is there any way to change input type="date" format?这似乎支持了这一说法。
关于angular - 在 Angular2 rc4 中对输入类型 = 日期使用自定义 ControlValueAccessor 时出现格式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39396225/
我已经使用日期、月份和年份的三个下拉菜单实现了一个日期选择器。日期选择器是一个实现了 ControlValueAccessor 并且运行良好的组件。但是,我希望当三个下拉菜单中的任何一个被触摸时,控件
我有这个组件使用 ControlValueAccessor .该组件有自己的内部表单,我找不到在哪里设置表单控件的初始值。 有人可以指出我正确的方向吗? import { Component, C
这是 stackblitz重现的组件/问题。 我构建了一个自定义输入组件: 获取用户对象数组以进行预输入过滤 将您的选择显示为标签 表单控件值是所选用户的数组 users[] 问题是 adding a
为什么当我使用 ControlValueAccessor 时,值不更新并以 react 形式反射(reflect)? 在我的应用程序中,我有一个表单: profileForm = new FormG
我将 Angular 9 与 Angular Material 一起使用,并且通过实现 ControlValueAccessor 接口(interface)来自定义控件。一切正常。 当表单无效时,在我
如果我在我的模板中放置一个实现 ControlValueAccessor 接口(interface)的自定义输入并像这样绑定(bind)到它的更改事件: 我的自定义输入不会在模糊时触发任何事件(
如果我在我的模板中放置一个实现 ControlValueAccessor 接口(interface)的自定义输入并像这样绑定(bind)到它的更改事件: 我的自定义输入不会在模糊时触发任何事件(
我有一个为模板驱动表单构建动态输入组件的指令。默认值由输入组件本身设置。 问题是设置默认值会导致表单被标记为脏。 如何在指令内部设置默认值而不将表单标记为脏? @Directive({ selec
我有这个自定义控件,其中包括一个选择组件。但在我的 react 形式中,值(value)永远不会传播。 有人可以帮我吗? 我的自定义控件: const SOME_SELECT_VALUE_ACCESS
我需要开发一个可重用的列表组件,它返回一个对象列表,一个简单的对象列表,那些应该被分配给 formGroup 对象值中的键。 有没有办法在 Angular 中做一个列表的自定义控件? 这是我尝试过的和
我已经实现了 ControlValueAccessor,如我正在关注的教程中所示。但是,我在其中实现 controlvalueaccessor 的组件似乎没有检测到对 ngModel 的任何更改。我错
我已经创建了一个简单的自定义 input我的 Angular 应用程序中的组件使用 ControlValueAccessor .所以,当我想创建一个表单 input元素,我不必调用 , 只能调用 .
ControlValueAccessors 在过去几个月突然出现在我面前,我对为什么或何时应该使用它们而不是使用 @Input 感到有些困惑。用我的 react 形式。 这是迄今为止我如何使用响应式(
Angular 版本:6.1 我正在尝试使用 Kara Erickson 所称的 Composite ControlValueAccessor 来实现自定义控件,如演示文稿中所示 Angular Fo
我想通过实现 ControlValueAccessor 创建自定义表单元素地址。 我正在尝试创建一个 AddressComponent,其中有多个输入字段。我想在如下所示的 react 形式中使用此组
我想通过实现 ControlValueAccessor 创建自定义表单元素地址。 我正在尝试创建一个 AddressComponent,其中有多个输入字段。我想在如下所示的 react 形式中使用此组
如我所描述in this answer ,我创建了一个自定义 ControlValueAccessor 指令来控制何时触发我的组件的 onChange 事件,并且一切正常,除了当我测试它时, regi
按比例缩小 plunkr:https://plnkr.co/edit/gGCiYjcq70xaewn3n22F?p=preview @Input() model: any; propagateChan
如果自定义组件是另一个组件下的包装器,我不确定如何使用它。 喜欢: ComponentA_withForm | --ComponentA1_withWrapperOfCustomInput |
当您在 ControlValueAccessor 中“写入值”时,为什么 ngOnChanges 没有被触发?我正在通过 registerOnChange 发出一些事件,但我在 ngOnChanges
我是一名优秀的程序员,十分优秀!