web-dev-qa-db-ja.com

手動でノックアウトを取得して、dependantObservableを再評価します

これが可能かどうかはわかりませんが、依存するオブザーバブルを介して何かが有効/無効になったときに検証システムに通知する検証システムがあるシナリオがあります。これは、dependantObservableが基になるobservablesの値の変化を追い払うため、ユーザーがフォームに入力するときにうまく機能します。 (つまり、Nameプロパティが変更されると、isValid依存オブザーバブルが再評価され、検証システムにフックするバインディングが通知されます)。

ここで私の問題は、ユーザーがフォームにまったく触れず、送信に直接進む場合、バインディングがトリガーされないことです。これは、オブザーバブルの基礎となる値が変更されていないため、サブスクライバーが検証の変更について知らないためです。ハプニング。理想的には、各オブザーバブルを調べて、現在の変数を[検証評価をプッシュする]に再度割り当てないようにします。これにより、検証状態の変更がトリガーされます。ですから、私が本当にやりたいことは、これをisValiddependantObservableにrefreshしてもらうことです。

それはどちらの方法でもかなり厄介なようですが、私の選択肢は次のいずれかであるようです:

1)検証されるすべてのオブザーバブルの値を強制的に変更します(恐ろしい)2)isValid dependentantObservableの再評価を強制してサブスクライバーをトリガーします(恐ろしくはないが、それでも悪い)3)検証ライブラリーを書き直して、forceValidation()関数は、何らかの方法ですべての再評価をトリガーし、検証パイプラインをトリガーする基礎となるオブザーバブルの必要性をバイパスします。

何か案は?

28
Grofit

計算されたオブザーバブル(isValid)でnotifySubscribers(currentValue)を呼び出すことができます。これにより、現在の値でサブスクライバーに通知されます。計算された値は再評価されず、現在の値でサブスクライバーに通知されるだけです。

51
RP Niemeyer

バインディングを追加_enable: formValid_ where formValid = ko.computed(return true if all values are valid)を送信ボタンに追加します。この方法では、フォームが適切に入力されるまで、ユーザーは送信できません。

ko.validation.validateObservable(yourDependentObservable)を使用してフィールドを手動で再検証する

または、yourDependentObservableyourObservableに依存する場合は、yourObsevable.notifySubscribers()を使用します。

4
blazkovicz