6

2 つのフィールドを持つオブジェクトがありますが、1 つは別のフィールド以下でなければなりません。

それが HDD クォータ設定であり、thresholdHDD の と同じかそれ以下である必要があるとしますsize

angular のui-utils#validateを使用しようとしています。

これは私がこれまでに得た方法です: http://embed.plnkr.co/EysaRdu2vuuyXAXJcJmE/preview (リンクが機能することを願っています)

私が抱えている問題は、それが一方向に機能することです:

設定sizeしてから再生しても問題ありthresholdません

しかし、変更しようとするとsize、 afterthresholdが無効な状態になり、何も起こりません。これは、無効thresholdがモデルに設定されておらず、sizeid がnullor undefined(またはそのようなもの) と比較されているためです。

一方では、モデルに無効​​な値を設定しないというロジックを理解しています...しかし、ここでは邪魔になっています。

したがって、この作業を行うための助けをいただければ幸いです。

4

2 に答える 2

6

私はカスタム ディレクティブで遊んで、自分の場合に役立つものを調理しました。

thresholdI haveディレクティブの入力で、検証するモデルのプロパティを渡します (次の値以下less-than-or-equal="quota.size"になりたい):quota.thresholdquota.size

<input type="number" name="threshold" 
    ng-model="quota.threshold" 
    required 
    less-than-or-equal="quota.size" />

ディレクティブlinkの機能では、監視を開始し、変更時にモデルの現在のビュー値を設定しようとします:lessThanOrEqualquota.sizequota.sizethreshold

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

于 2013-05-30T23:01:15.910 に答える
3

遅かれ早かれ、これが起こらないようng-model-options="{allowInvalid:true}"にフォーム入力要素に追加する必要があります。問題は、promise が拒否された場合 (たとえば$qorを使用$http)、デフォルトではモデルが更新されないことです。クレイジーか!これを解決するのに1日かかります。

私はこの問題のために特別にplunkrを書きました - このコードは良いと信じてください... http://embed.plnkr.co/xICScojgmcMkghMaYSsJ/preview

于 2015-11-23T07:55:29.347 に答える