【问题标题】:Angular doesn't restore null-but-valid input value on model change when input is invalid当输入无效时,Angular 不会在模型更改时恢复 null-but-valid 输入值
【发布时间】:2014-10-14 03:24:39
【问题描述】:

我在<input> 和表单验证中遇到了一个奇怪/令人困惑的行为。

本质上,如果输入具有无效的数值(将form.$valid 设置为false),如果模型值更改为null,它会将$valid 标志设置回true,但不会'不更改输入字段中显示的值。

我创建了一个plunker 来说明。请按照以下步骤重现:

  1. 将单元格的值修改为空。
  2. 点击保存链接(将null保存到模型中)
  3. 输入一个非数字字符。
  4. 点击reset链接(从模型中恢复null
  5. 观察输入字段不再无效,但无效字符仍然存在。

这是一个错误还是我做错了什么?

编辑:

我开始相信这是一个错误。我通过引入另一个强制 ""null 值的指令来“修复”它。 这是带有“修复”的fork of the plunker above

EDIT2:

这已在 v1.3+ 中修复

【问题讨论】:

    标签: angularjs angularjs-ng-model


    【解决方案1】:

    您的代码运行良好,但您忘记在 app.js 中添加验证检查

     this.save = function(){
          if($scope.mainForm.$valid && !this.get() == ""){
              old_num = num;
          }
     };
    

    您应该仅在表单有效时保存该值。

    但这并不是一个完整的证明解决方案,因为整个表单必须有效才能使保存工作。为了进一步改进算法,我建议您标记单个模型的有效性并检查单个模型的有效性。

    希望对你有帮助

    【讨论】:

    • 感谢您的回复,但这对我没有帮助。问题发生在我保存有效(例如空/空)值但无法恢复的情况下。所以,使用你的建议并不能解决我描述的错误。
    • 再次,我的问题是一个非常具体的表单验证行为。它与我如何/何时保存表单几乎没有关系。
    • 不能先检查空值吗?检查我的修改。我添加了一个检查以查看该值是否为空。我测试过,它在我身边有效。万事如意
    • 我没有保存问题 - 我有重置问题。我不明白你的修复是什么。您是否按照问题中的重现步骤进行操作?
    • 这不是错误 - 这是我放在那里查看发生了什么的日志消息。当值无效时,ngModel 指令将模型设置为undefined。问题是当我尝试将模型设置回 null 时 - 无效标志被重置,但无效值保留在输入字段中。
    【解决方案2】:

    遇到了类似的问题,我先解决了:

    form.$rollbackViewValue()form.field.$rollbackViewValue 如果是 .$invalid,然后再执行我的任何其他重置代码。

    在您的示例中,您可以更改为:

    <button class="btn btn-link" ng-click="cellForm.$rollbackViewValue(); item[prop].reset()">reset</button>

    【讨论】:

    • 这实际上是一个错误 - 它已在 v1.3+ 中修复
    猜你喜欢
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2016-02-05
    • 2017-10-10
    相关资源
    最近更新 更多