2

ある程度の深さ/複雑さを持つViewModelにバインドされたビューにKnockoutを使用しています。

ViewModelを検証するには、VMツリー全体を計算する必要があります(子孫のウォーキングと比較)。私は、ノックアウト検証プラグイン@ https://github.com/ericmbarnard/Knockout-Validationを利用して、任意のカスタム検証ルールを作成し、エラーを報告したいと考えていました。

http://jsfiddle.net/drdamour/ZrVZ7/でKO計算されたオブザーバブルを使用して1つの可能なアプローチを設定しました。検証ルールは、2つのサブコレクションが同じ値を持たないことを確認することです。これは機能していますが、Knockout-Validationを使用しておらず、私のルールは計算されたobservableに実装されていますが、これは間違っているようです。

私の質問はKnockoutValidationvalidatedObservable group errorと非常に似ていますが、発見されたソリューション(http://jsfiddle.net/CGuW2/6/でホストされている)は理想的とは言えません。

var viewModel = {
    num1: ko.observable("50").extend({ number: true, min: 0, max: 100 }),
    num2: ko.observable("50").extend({ number: true, min: 0, max: 100 })
};

viewModel.isValidSum = ko.validatedObservable({
                            num1: viewModel.num1,
                            num2: viewModel.num2
                        }).extend({ mustEqual: 100 });

ko.applyBindings(viewModel);

検証済みの自己をプロパティとしてそれ自体(isValidSum)に追加することにより、ViewModelを複製しているためです。http://jsfiddle.net/drdamour/5B8s4/でこの冗長性を排除しようとしましたが、ビューはvalidatedObservableにバインドできません。

var viewModel = {
    num1: ko.observable("50").extend({ number: true, min: 0, max: 100 }),
    num2: ko.observable("50").extend({ number: true, min: 0, max: 100 })
};

var vm = ko.validatedObservable(viewModel).extend({ mustEqual: 101 });

ko.applyBindings(vm);

これは、KOまたはKO-Validationのバグである可能性があります。または、まったく間違っている可能性があります。

したがって、問題は、VMの複数のプロパティとレイヤーにわたって評価される条件に対してVMが有効であるかどうかを判断するためのノックアウトの最良の方法は何ですか?

4

1 に答える 1

4

groupingモデルで検証したいオブザーバブルによってモデルを検証するために別のアプローチをとることで、このワゴンの旋回を回避します。

これは私のステージを設定するために使用されるいくつかの初期化コードです(ここで利用可能なすべてのオプションを見ることができます:

    ko.validation.init({
        registerExtenders: true,
        parseInputAttributes: true,
        grouping: { deep: true, observable: false }
    });

次に、次のようにモデルを設定します。

function testModel() {
    var self = this;
    self.num1 = ko.observable(100).extend({ number: true, min: 0, max: 100 });
    self.num2 = ko.observable(50).extend({ number: true, min: 0, max: 100 });

    self.sum = ko.observable(150).extend({ number: true, equal: 100 });
    self.num1.subscribe(function () {
        self.sum(self.num1() + self.num2());
    });
    self.num2.subscribe(function () {
        self.sum(self.num1() + self.num2());
    });

    self.errors = ko.validation.group(this);
}

var viewModel = new ViewModel();

//somewhere later where we are testing the model
if (viewModel.sum.isValid())
    //YAY!!!
else
   //this will update the UI as you have configured it to show the error messages
   viewModel.errors.showAllMessages(); 

を使用ko.validation.group(model)すると、検証でモデル内のすべてのオブザーバブルがトラバースされます(深さは初期設定によって異なりますが、私が作成したことに注意してください。grouping: { deep: true }つまり、このモデル内にオブザーバブルを含むサブモデルがある場合は、それらも検証されます。

さまざまな検証ケースを分離する場合は、モデル全体だけでなく、モデルの一部でもこれを行うことができます。

編集:

これは、機能する要件を満たすためのアプローチです。条件に対して検証するすべてのオブザーバブルをサブスクライブする必要があるのは理想的ではありませんが、唯一の代替手段は、データに対して最も可能性の高い構造を意味するvalidatedObservableにグループ化することです。

于 2013-01-04T00:42:06.880 に答える