2016-05-19 14 views
0

カスタムルールを取得できません。私は何か基本的なことを理解していないのが残念です。この例では、b,bvmおよびberrはすべてrequiredエクステンダーの予想通りに検証されています。カスタムエクステンダfooに対して、a,avmおよびaerrは、検証が期待通りに失敗しません。ノックアウト検証カスタムルールが機能しない

validatorからconsole.log()を呼び出すと、バリデータが起動されていないことが示されます。バリデータ関数を起動する唯一の方法は、initの後にko.registerExtendersを呼び出すことです(これを行う理由はありませんが、registerExtendersがデフォルトで有効になっています)。呼び出された場合、エクステンダの作成を参照するとvalidatorがトリガされます。観察可能な配列。

Here's my fiddle.

ko.validation.init({ 
    grouping: { 
     deep: true, 
     live: true, 
     observable: true 
    } 
}); 

ko.validation.rules['foo'] = { 
    validator: function(arr) { 
     if (!arr.length) { 
      return false; 
     } else { 
      return true; 
     } 
    }, 
    message: 'Please foo.' 
}; 
var a = ko.observableArray().extend({ foo: true }); 
var avm = ko.validatedObservable({ 
    a: a 
}); 
var aerr = ko.validation.group([a]); 

var b = ko.observableArray().extend({ required: true }); 
var bvm = ko.validatedObservable({ 
    b: b 
}); 
var berr = ko.validation.group([b]);  

答えて

1

カスタムエクステンダの後にregisterExtendersを呼び出すほど、initの配置は重要ではありません。その行を省略すると、カスタムエクステンダーは経験したように無視されます。

https://jsfiddle.net/c7xynchp/12/

var log = console.debug.bind(console, '[Debug]'); 
ko.validation.rules['foo'] = { 
    validator: function(arr) { 
     log('validator', arguments); 
     if (!arr.length) { 
      log('invalid'); 
      return false; 
     } else { 
      log('valid', arr); 
      return true; 
     } 
    }, 
    message: 'Please select at least one vendor.' 
}; 
ko.validation.registerExtenders(); 
var a = ko.observableArray().extend({ foo: true }); 
var avm = ko.validatedObservable({ 
    a: a 
}); 
var aerr = ko.validation.group([a]); 

var b = ko.observableArray().extend({ required: true }); 
var bvm = ko.validatedObservable({ 
    b: b 
}); 
var berr = ko.validation.group([b]); 
ko.validation.init({ 
    grouping: { 
     deep: true, 
     live: true, 
     observable: true 
    } 
}); 

log('a', a.isValid()); 
log('avm', avm.isValid()); 
log('aerr', aerr()); 
log('b', b.isValid()); 
log('bvm', bvm.isValid()); 
log('berr', berr()); 

// just for laughs 
log('aberr', ko.validation.group([a,b])()); 
0

私はあなたが(あなたがあなたのfoo検証ルールを登録した後ko.validation.init FNを呼び出す)、すべてのカスタム検証ルールを登録した後、あなたが検証プラグインを初期化する必要があると思う。

プラグインを初期化すると、以前に登録した設定とルールで動作するので、後で登録されたすべてのカスタムルールは考慮されません(指摘した場合を除き、registerExtendersと呼びます)。すべてのカスタムエクステンダを再度登録するよう強制する)。

また、特定のオブジェクト専用に登録されたカスタムルール(自分の修正内容:https://jsfiddle.net/elbecita/c7xynchp/10/を参照)は、検証プラグインの初期化時にも常に考慮されます。

希望すると助かります!