【问题标题】:ERROR Missing number at position 0 when using setValue angular 4错误使用 setValue angular 4 时位置 0 处缺少数字
【发布时间】:2018-02-13 12:48:50
【问题描述】:

我正在使用 Angular 4 和反应形式,momentjsprimeng calendar 我想使用 setValue 并尝试在包含日期的反应形式字段上使用 patchValue。此日期是通过primeng 日历创建的。

purchaseDate: Sat Sep 02 2017 00:00:00 GMT+0100 (GMT Daylight Time)

我使用这个“日期”来做几件事,然后我使用momentjs 将日期转换为干净的格式,以便后端接受(即YYYY.MM.DD)使用@987654330 @

但是,当我运行 .setValue 时,我收到以下控制台错误 ERROR Missing number at position 0 并且无法弄清楚原因。

// convert the date
let newDate = moment(this.form.get('purchaseDate').value).format('YYYY.MM.DD');
// let newDate = moment(this.form.get('purchaseDate')).format('YYYY.MM.DD');
// with or without .value - display the same below (2017.09.01)
console.log(newDate); // 2017.09.01
this.form.get('purchaseDate').setValue(newDate);

// if I create a seperate (empty) reactiveForms field to test against
this.form.get('testField').setValue(newDate) // this works fine

我已将问题追溯到我尝试设置/修补primeng日历值时 - 由于某种原因不喜欢被更改。

已更新格式

在 setValue 上发生的问题接缝现在出现以下错误 Unexpected literal at position 2 at viewWrappedDebugError

【问题讨论】:

  • 您需要传入 formGroup 值,我认为 moment 不会接受单个 ymoment(this.form.get('purchaseDate').value).format('yy.MM.dd');
  • Moment format 不接受小写的y 作为年份标记,请改用YYYYYYY。此外请注意,小写的dd 标记代表星期几SuMo...FrSa),如果你想使用大写的DD一个月中的哪一天 (01 02 ... 30 31)
  • @JayChase & @VincenzoC 嗨,谢谢 - 我已经根据你的建议更新了代码,但现在收到了 ERROR Error: Unexpected literal at position 2
  • 仅供参考 @JayChase 省略 .value 没有区别,我正在记录 newDate 并且无论是否有.value 都会出现同样的情况
  • 您是否尝试将newDate 设为moment 对象(let newDate = moment(this.form.get('purchaseDate').value)),然后将purchaseDate 的值设置为Javascript 日期(使用moment toDate()this.form.get('purchaseDate').setValue(newDate.toDate());)?跨度>

标签: javascript angular momentjs primeng angular-reactive-forms


【解决方案1】:

问题是 PrimeNG 日期选择器期望接收 Date 类的实例作为值,并返回 Date 类的实例作为值。这就是为什么您尝试将其他类型的对象放在那里失败的原因。

不清楚您为什么尝试在提交处理程序中调用setValue()

如果您的目标是以编程方式修改值,请按照 VincenzoC 在 cmets 中的建议 - 修改对象并将其转换回 Date 对象,然后再将其传递给 setValue()

let newDate: Date = moment(this.form.get('purchaseDate').value).add(5, 'days').toDate();
this.form.get('purchaseDate').setValue(newDate);

如果您的目标是格式化Date 对象以提交到后端,则根本不需要调用setValue()。将 Date 对象格式化为字符串,并将此字符串而不是 Date 对象传递给后端 API。如果您从表单提交整个 value 对象,您可以在提交之前以这种方式修改它:

let newDate: string = moment(this.form.get('purchaseDate').value).format('YYYY.MM.DD');
let dataForBackend = { ...this.form.value, purchaseDate: newDate };
this.myBackend.sendData(dataForBackend);

【讨论】:

    【解决方案2】:

    我有类似的问题,我注意到我试图以错误的顺序给 PrimeNG 日期:

    {date: "2018-01-31"} - works perfectly fine,
    {date: "31-01-2018"} - ERROR Missing number at position 0
    

    对我来说就这么简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多