【问题标题】:Angular 2 Template driven form with custom input带有自定义输入的Angular 2模板驱动表单
【发布时间】:2017-01-23 11:00:39
【问题描述】:

我有一个带有只读输入的模板驱动表单。当用户点击输入时,会出现一个日期选择器。用户选择日期后,输入字段将填充信息。但是,当我单击提交时,该输入中的数据不存在。其他领域虽然有效。所以在这种情况下,我得到 ​​p> 的输出

控制台输出:

Object {refNumber: "215170", date: ""}

HTML 代码:

<form [formGroup]="myForm" novalidate (ngSubmit)="onSubmit(myForm)">

    <div class="form-group">
        <label>Reference Number</label>
        <input type="text" class="form-control" formControlName="refNumber">
    </div>

    <!--Date Picker-->
    <input (focus)="toggleDatePicker(true)" readonly value={{date}} class="form-control" formControlName="date" />

    <date-picker *ngIf="showDatePicker" [initDate]="date" (onDatePickerCancel)="toggleDatePicker($event)" (onSelectDate)="setDate($event)"
        ngDefaultControl></date-picker>

</form>

组件代码

 export class AppComponent implements OnInit {

public myForm: FormGroup;

constructor(private _fb: FormBuilder) { }

ngOnInit() {
    this.myForm = this._fb.group({
    refNumber: ['', [Validators.required, Validators.minLength(5)]],
    date: [''],
    });
}

onSubmit(formOutput: FormGroup) {
    console.log(formOutput.value);
    alert('Submit this data to database')
}

// Date TimePicker
private date: any;
private showDatePicker: boolean;

// Date Pciker
toggleDatePicker(status: boolean): void {
    this.showDatePicker = status;
}

setDate(date: any): void {
    this.date = date;
}
}

---------更新-------------- 我创建了一个新项目只是为了复制这个问题。问题仍然存在。这是该项目中正在发生的事情的视频。对我来说,输入值似乎只有在我输入内容时才会更新。任何硬编码的值,或者在这种情况下,传入的日期,都不会更新幕后的实际输入值?

https://www.youtube.com/watch?v=4xc3m6qbILc

https://github.com/eddy80310/formsissue

【问题讨论】:

    标签: javascript forms angular


    【解决方案1】:

    似乎datepicker 返回的对象既不是Date 也不是String,也没有定义toString()。根据控制台输出,对 setDate 函数的以下更改应该可以解决问题。

    setDate(event: any): void {
        // console.log(event);
        this.date = event.date;
    }
    

    如果这不能解决问题,则取消注释函数中的console.log 以检查event 对象的格式并相应地设置this.date 值。

    最终编辑

    好的.. 花了我一段时间在 Plunker 上找出实际问题。您直接在 DOM 元素上设置值。现在的问题是,它不会触发任何事件让 ngModel 知道更改。

    为此采取了两种解决方案(测试了两者都有效):

    1. 使用setValue 更改输入文本框的值。示例this.myForm.controls['date'].setValue(dateValue)

    2. 在您的输入元素中使用ngModel。替换value={{dateValue}}[(ngModel)]='dateValue'。由于您的输入元素是只读的, 你也可以使用单向数据绑定 [ngModel]='dateValue'.

    我已经在 Plunker 上测试了这两种解决方案。这是链接到 PlunksetValue()(第一个选项)。

    【讨论】:

    • 它的格式似乎不是问题。因为我试图从 setDate() 中删除所有代码并设置私有日期 =“1234”。当我这样做时,我看到输入字段确实填充了 1234,但是,在提交时,我仍然看到日期为“”的相同输出。我猜设置 value={{date}} 不适用于表单?我什至尝试在 html 中对 value="1234" 进行硬编码,结果是一样的。但是,如果我摆脱 readony 并输入内容,在这种情况下表单似乎可以很好地获取数据
    • 还有一个问题。您的输入名称为 date,并且组件中的变量名为 date!因此,如果选择日期值,则会导致混乱。
    • 感谢您指出这一点。我已经改变了。另外,请参阅我之前的评论以获取更多信息。非常感谢您的帮助
    • 找到问题和解决方案。请参阅上面的编辑。
    • 我知道没有检测到更改。使用 Plunker 我验证了我是对的。此后,我想到的第一个解决方案是ngModel,但不知何故我不喜欢将它与ReactiveForms 混在一起,所以第二个选择是尝试setValue()。如果您仍想直接设置 DOM 值,也可以使用emitEvent
    猜你喜欢
    • 2017-01-29
    • 2017-01-15
    • 2017-01-30
    • 1970-01-01
    • 2016-04-26
    • 2016-04-29
    • 2022-07-07
    • 2017-09-14
    • 2022-01-27
    相关资源
    最近更新 更多