我正在尝试使用 AngularJS 实现一些验证。我有一个绑定到范围内对象列表的输入列表,我想确保每个输入中的值大于或等于它之前的输入中的值(假设我只输入数值到输入)
这意味着当一个值被改变时,什么时候需要检查:
- 新值仍然大于或等于前一项(如果不是列表中的第一项)
- 后面的列表项(如果有的话)仍然大于等于新变化的值
我不确定解决这个问题的最佳方法,但我希望尽可能多地使用 AngularJS 验证框架。我看到了 3 种可能的解决方案:
1:创建自定义指令来执行验证
我找到了这样做的例子,但我在这里有两个问题:
- 您将如何访问与
当前正在验证的范围属性相关的范围属性?
- 例如,如果在索引 1 处绑定的输入值发生更改,是否可以触发指令重新评估在索引 2 处绑定的输入值,因为更改索引 1 处的值可能会使其无效?到目前为止,我已经看到指令函数仅针对刚刚更改的绑定触发。
2:使用 ui-validation
在这种情况下,我能够将列表项的索引提供给验证函数。因此,这意味着我可以访问前一个列表项的值进行评估。但我仍然有一个问题,它只针对刚刚更改的项目触发 - 列表中的下一个项目没有重新评估。
3:在每个绑定的输入值上实现一个 onChange 事件处理程序
我有一个 jsFiddle 这个:
但在这种情况下,如果我掌握的只是底层范围属性,我不知道如何调用 $setValidity 函数。下面的代码失败:
if (eval($scope.items[i].value) < eval($scope.items[i - 1].value)) {
$scope.items[i].$setValidity('notinorder', false);
}
我想我可以使用第二种方法来实现它,而根本不需要触及 AngularJS 验证框架——但如果有一种“正确”的方式可以使用它,那么我很想知道......