6

我有一个有 2 个字段的对象,而 1 应该小于或等于另一个。

假设它是 HDD 配额设置,我需要threshold小于或等于 HDD 的size.

我正在尝试使用 Angular 的ui-utils#validate

这就是我到目前为止的方式: http: //embed.plnkr.co/EysaRdu2vuuyXAXJcJmE/preview(我希望链接能正常工作)

我遇到的问题是它朝着一个方向工作:

设置size然后玩就threshold可以了

但是,如果我尝试更改size,则 afterthreshold处于无效状态 - 没有任何反应。这是因为threshold模型上没有设置无效,并且sizeid 与nullor undefined(或类似的东西)进行比较。

一方面,我理解不在模型上设置无效值的逻辑......但在这里它妨碍了我。

因此,我们将不胜感激任何帮助完成这项工作。

4

2 回答 2

6

我玩过自定义指令并做了一些适合我的情况的东西。

在我输入的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

我正在将解析器推送到解析器集合,这与大多数示例建议的那样不移动它相反,因为我想要角度来验证requirednumber指令,所以只有当我有一个有效和解析的数字时我才会到达这里(对我来说工作更少,但是对于text输入,我可能应该做解析工作)

这是我的游乐场:http ://embed.plnkr.co/EysaRdu2vuuyXAXJcJmE/preview

于 2013-05-30T23:01:15.910 回答
3

迟到总比没有好,您需要添加ng-model-options="{allowInvalid:true}"到表单输入元素以阻止这种情况发生 - 问题是当一个承诺被拒绝(例如使用$qor $http)时,默认情况下模型不会更新。疯了吧!花了我一天的时间解决这个问题。

我专门为这个问题写了一个 plunkr - 相信我这个代码很好...... http://embed.plnkr.co/xICScojgmcMkghMaYSsJ/preview

于 2015-11-23T07:55:29.347 回答