【问题标题】:How to use $setViewValue with input date using Angular 1.4如何使用 Angular 1.4 将 $setViewValue 与输入日期一起使用
【发布时间】:2016-08-31 07:29:35
【问题描述】:

使用基本输入日期:

 <form name="form">
    <input type="date" name="startDate" my-directive.........

我想通过使用$setViewValue 在输入中注入值来对相应的myDirective 进行单元测试。

基本上我决定使用$parsers.push 来检索日期对象(因为在解析器链的末尾):

link: function ($scope, element, attr, ctrl) {
                ctrl.$parsers.push(function (viewValue) {
                    alert(viewValue);
      //.....  

单元测试调用是这样的:

$scope.form.startDate.$setViewValue(new Date(2014,8,14));

我在警报中收到undefined

如果我这样打电话:

$scope.form.startDate.$setViewValue('2014-08-14');

我获得Thu Jan 01 1970 而不是Thu Aug 14 2014

有人经历过吗?如果是,如何解决?

【问题讨论】:

  • ngModelController有两种方式:从模型到视图,从视图到模型。当值从视图传递到模型时,使用 $parsers,当从模型传递到视图时 - $formatters。当您在逻辑上调用 $setViewModel 时 - 视图方向,因此将被称为 $formatters 而不是 $parsers
  • 恰恰相反;) 解析器正在获取视图模型值,并且必须映射到模型值。所以要模拟 viewModel 的变化,我们必须通过 $setViewValue 来设置它。 (而不是 $setViewModel)
  • 可以加plunkr吗? :-) 所以我们可以检查一下。我也明白了,我把setViewModelsetViewValue 混淆了:-)
  • 对我来说很好。你能创建一个重现你的问题的 plunkr 吗?
  • 我创建了这个 plunkr 但在这里也可以正常工作...plnkr.co/edit/BueAIByuXYozWjMy3fzB?p=preview我正在搜索我的代码问题。

标签: javascript html angularjs angularjs-directive


【解决方案1】:

根据文档,您应该调用

vm.myForm.startDate.$render();

$setViewValue之后

【讨论】:

    【解决方案2】:

    $setViewValue('2014-08-14'); 将值设置为输入元素的value 属性。所以尝试将值设置为日期对象是无效的。

    来自 Angular 文档:link

    当与标准输入一起使用时,视图值将始终是一个字符串(在某些情况下会被解析为另一种类型,例如 input[date] 的 Date 对象。)

    我很困惑你为什么得到Thu Jan 01 1970!您能否仔细检查传递的字符串是否是有效的日期字符串。同样在 JS 月份是从 0 开始的,所以对于 8 月,您需要使用 07 而不是 08

    【讨论】:

    • 我不同意。解析器旨在将 viewmodel 映射到 js 模型。
    猜你喜欢
    • 2012-04-28
    • 2019-03-27
    • 2021-10-01
    • 2014-06-14
    • 1970-01-01
    • 2021-02-18
    • 2011-10-22
    • 2021-08-31
    • 1970-01-01
    相关资源
    最近更新 更多