我玩过自定义指令并做了一些适合我的情况的东西。
在我输入的threshold
指令less-than-or-equal="quota.size"
中,将模型的属性传递给它以进行验证(我希望quota.threshold
小于或等于quota.size
):
<input type="number" name="threshold"
ng-model="quota.threshold"
required
less-than-or-equal="quota.size" />
在指令link
的功能中,lessThanOrEqual
它开始观察quota.size
并且当quota.size
改变它只是试图设置threshold
模型的当前视图值:
link: (scope, elem, attr, ctrl) ->
scope.$watch attr.lessThanOrEqual, (newValue) ->
ctrl.$setViewValue(ctrl.$viewValue)
scope.thresholdValidate(thresholdValue)
然后是解析器通过调用传递候选值的方法来进行验证。如果验证成功,则此方法返回true
,如果成功,则返回新值,否则返回当前模型的值:
ctrl.$parsers.push (viewValue) ->
newValue = ctrl.$modelValue
if not scope.thresholdValidate viewValue
ctrl.$setValidity('lessThanOrEqual', false)
else
ctrl.$setValidity('lessThanOrEqual', true)
newValue = viewValue
newValue
我正在将解析器推送到解析器集合,这与大多数示例建议的那样不移动它相反,因为我想要角度来验证required
和number
指令,所以只有当我有一个有效和解析的数字时我才会到达这里(对我来说工作更少,但是对于text
输入,我可能应该做解析工作)
这是我的游乐场:http ://embed.plnkr.co/EysaRdu2vuuyXAXJcJmE/preview