2

ノックアウト検証プラグインを探していて、非常に有望に見えるノックアウト.検証に出くわしましたが、致命的な欠陥があります..

ko.validatedObservable({ name: foo }) を作成すると、そのオブザーバブルに新しいオブジェクトを割り当てることはできません。

例: 私のビュー モデルでは、検証済みのオブザーバブルをインスタンス化します。

var item = new ko.validatedObservable(new Tag({}));

その後、次のように呼び出すことができます。

item().isValid(); //Returns false in this case because Tag is empty

タグはこんな感じ

Model.Tag = function (data) {
    var
        Id = ko.observable(data.Id),
        Name = ko.observable(data.Name).extend({ required: true, maxLength: 64 }),
        Description = ko.observable(data.Description).extend({ required: true, maxLength: 512 });

    return {
        Id: Id,
        Name: Name,
        Description: Description
    };
};

問題は、サーバーから新しいタグを取得して、そのタグを変更したい場合です..

        $.ajax({
            url: API + "/" + id,
            type: 'GET',
            dataType: 'json',
            timeout: Timeout,
            statusCode: {
                200: function(response) { item(response); },  //Here is where the bug is!
                404: ItemNotFound
            },
            error: function () {
                Item(new Type({}));
            }
        });

アイテムにはサーバーからの値が含まれるようになりましたが、実行すると

item().isValid();  //False is returned

これは、GitHub プロジェクトhttps://github.com/ericmbarnard/Knockout-Validation/issues?state=openのバグ #209 としてリストされています。

エレガントな回避策を知っている人はいますか? または、この目標を達成する別のプラグインですか?

4

1 に答える 1

2

それがどれほどエレガントかはわかりませんが、おそらくこれは最善の解決策ではない (またはまったく解決策ではない) ため、自己責任で使用してください。

ko.validatedObservableただし、「修正済み」バージョンでオーバーライドできます。

ko.validatedObservable = function (initialValue) {
    if (!ko.validation.utils.isObject(initialValue)) {
            return ko.observable(initialValue).extend({ validatable: true });
    }

    var obsv = ko.observable(initialValue);
    obsv.lastErrors = ko.observable(ko.validation.group(initialValue));    
    obsv.subscribe(function(newValue){             
        obsv.lastErrors(ko.validation.group(newValue));
    });
    obsv.errors = function() {        
        return obsv.lastErrors()();
    };
    obsv.isValid = ko.computed(function () {
       return obsv.errors().length === 0;
    });   

    return obsv;
};

私の修正では、ko.validation.group呼び出しの結果を保存し、基になる観察可能要素が変更されたときにそれを再計算し、元のエラー プロパティobsvを変更してそのプロパティを使用するようにしました。lastErrors

このデモJSFiddleでチェックしたgithub の問題からサンプルを更新しました。

于 2013-03-10T16:50:51.083 に答える