1

ビューモデルを検証するために、ノックアウトjs検証プラグインとともにノックアウトjsを使用しています。ここに私のJavaScriptコードがあります

// enable validation
ko.validation.init();

// View model
function AppViewModel() {

    this.Canceled = ko.observable(false);

    this.Name = ko.observable("").extend({

        //custom validation
        validation: {
            validator: function (val, params) {

                //alert to show when validation is triggered
                alert("validation function was called");

                //change validation rule depending on whether cancel button was clicked
               if(params.Canceled == true)
                   return true;
                else
                   return false;

            },
            message: 'This field is required',
            params: {Canceled:this.Canceled()}
        }
    });


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

    //function triggered on submit which checks for validation
    this.submit = function() {
        if(this.errors().length != 0)
            this.errors.showAllMessages();
        else
            alert("no errors detected");
    };

    //function to cancel validation rules
    this.cancelValidation = function() {
        this.Canceled(true);
    };
}

// Activate knockout.js
ko.applyBindings(new AppViewModel());​

ここに私のHTMLがあります

Name: <input type="text" data-bind="value: Name"/><br/><br/>
<button data-bind="click: submit">submit</button> <button data-bind="click: cancelValidation">Cancel validation</button>​

私がやろうとしているのは、「検証のキャンセル」ボタンがクリックされた場合に、実行時に検証ルールを変更することです。これを行うために、「Canceled」と呼ばれる ko.observable 変数と共にカスタム検証関数を使用しています。「キャンセル」の値に応じて、バリデーター関数は true または false を返します。私が抱えている問題は、ページの読み込み時に検証機能が 1 回しか実行されないことです。「キャンセル」の値が変更された場合、関数は再実行されません。これは正常な動作ですか?「キャンセル」の値を変更したときに、現在のモデルの検証機能を再実行する方法はありますか?

ここにコードを試すためのフィドルがあります。ページの読み込み時に一度だけ実行されることを示すために、検証関数内にアラートを追加しました。

http://jsfiddle.net/eewJe/

4

2 に答える 2

1

値ではなく、オブザーバブルをオプションに渡す必要があります。変化する

if(params.Canceled == true)

if(params.Canceled() == true)

オブザーバブルを渡します。変化する

params: {Canceled:this.Canceled()}

params: {Canceled:this.Canceled}

更新されたフィドルは次のとおりです。 http://jsfiddle.net/nEPNC/

于 2013-06-21T03:56:48.290 に答える
0

気にしないでください、私はそれを自分で解決することができました。この質問に出くわした人のために、ここに私の更新された Javascript があります

// enable validation
ko.validation.init();


// View model
function AppViewModel() {

    var self = this;

    this.Canceled = ko.observable(false);

    this.Name = ko.observable("").extend({

        //custom validation
        validation: {
            validator: function (val,para) {

                //alert to show when validation is triggered
                alert("validation function was called");

                //change validation rule depending on whether cancel button was clicked
               if(self.Canceled() == true)
                   return true;
                else
                   return false;

            },
            message: 'This field is required'
        }
    });


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

    //function triggered on submit which checks for validation
    this.submit = function() {
        if(this.errors().length != 0)
            this.errors.showAllMessages();
        else
            alert("no errors detected");
    };

    //function to cancel validation rules
    this.cancelValidation = function() {
        this.Canceled(true);
    };
}

// Activate knockout.js
ko.applyBindings(new AppViewModel());​

バリデーターの「params:」プロパティを使用する前に行っていたように、Canceled をパラメーターとして渡す代わりに、self.Canceled() の値を直接チェックするようにバリデーター関数を変更しました。すべてが正常に動作するようになりました。ここに更新されたフィドルがあります

http://jsfiddle.net/HtYCw/

誰かがそれを行うためのより良い方法を持っているなら、私はまだコメントに興味があります.

于 2013-01-02T19:37:34.480 に答える