2013-09-23 13 views
7

GitHub'dan Knockoutjs Doğrulama eklentisini kullanmaya çalışıyorum. Çoğu sadece iyi çalışıyor gibi görünüyor ama genişletilmiş doğrulama mustEqual (parola/onaylama parolası) kullanmaya çalıştığınızda, hiçbir şey yapmıyor gibi görünüyor. Neyi kaçırıyorum?Knockoutjs doğrulamaları areSame veya mustMatch örnekleri

Gelecekte kullanım için bu genişletici tekniğini öğrenmek isterim.

(aynı zamanda tüm bu html ve javascript AJAX çağrı yoluyla sayfaya yüklenen olsun. Bunun bir ilgisi varsa.)

Benim javascript

function UserAccount(data) { 
     var self = this; 
     self.Password = ko.observable(data.Password).extend({ required: true, minlength: 6, message: "Password is required", maxLength: 12 }); 

     self.Firstname = ko.observable(data.Firstname).extend({ required: true, minlength: 6, message: "Firstname is required", maxLength: 40 }); 
     self.Lastname = ko.observable(data.Lastname).extend({ required: true, minlength: 6, message: "Lastname is required", maxLength: 40 }); 
     self.Email = ko.observable(data.Email).extend({ required: true, minlength: 6, message: "Email is required", email: true, maxLength: 90 }); 
     self.ConfirmPassword = ko.observable().extend({ mustEqual: self.Password()}); 
     ...........................Other Code............ 
     } 

    ko.validation.rules['mustEqual'] = { 
     validator: function (val, otherVal) { 
      alert("Hello"); 
      return val === otherVal; 
     }, 
     message: 'The field must equal {0}' 
    }; 
    $(document).ready(function() { 


     ko.applyBindings(new UserAccount(initdata), $("#UserAccount").get(0)); 
     ko.validation.registerExtenders(); 

    }); 

cevap

10

Size özel doğrulayıcı kodu sorun yok. Ancak, doğru olarak ko.validation.registerExtenders(); yöntemini çağırmıyorsunuz.

açıkça belirtildiği ama sen ko.applyBindings aradığınız ko.validation.registerExtenders(); önce aramak gerekmez rağmen.

Yani kodunuzu düzeltmek için sadece yazmak gerekir:

$(document).ready(function() { 
    ko.validation.registerExtenders(); 
    ko.applyBindings(new UserAccount(initdata), $("#UserAccount").get(0)); 
}); 

Ama başka bir sorun karşı karşıya gelecek: mustEqual doğrulayıcı statik değerler karşılaştırmak içindir Eğer ikisini karşılaştırmak istiyorsanız işe yaramaz böylece Şifreyi onaylamak için şifre gibi özellikler. İhtiyacınız ne

user contributed "Are Same" validator gibi bir şey:

ko.validation.rules['areSame'] = { 
    getValue: function (o) { 
     return (typeof o === 'function' ? o() : o); 
    }, 
    validator: function (val, otherField) { 
     return val === this.getValue(otherField); 
    }, 
    message: 'The fields must have the same value' 
}; 

sizin gibi kullanabilirsiniz Ne:

self.Password = ko.observable(data.Password).extend({ 
    required: true, 
    minlength: 6, 
    message: "Password is required", 
    maxLength: 12 
}); 
self.ConfirmPassword = ko.observable().extend({ 
    areSame: self.Password 
}); 

Demo JSFiddle.

+0

Bu işe yaradı. Aslında ilk başta issame işleviyle çalışıyordum ama işe yaramadı. Daha basit göründüğünden, mustEqual'e geçtim. Ko.validation ... ve ko.applyBindings her zaman bir $ (document) .ready olmalıdır? – DanScan

+0

DOM yüklendikten sonra 'ko.applyBindings' çağrılmalıdır, böylece $ (document) .ready' koymak için iyi bir yer. Tüm özel doğrulayıcılarınızı tanımladığınızdan sonra “ko.validation.registerExtenders();”) çağrılmalıdır. Yani doğrudan ko.validation.rules ['areSame'] = {} 'den sonra çağrılabilir, bu yüzden '$ (document) .ready' olarak adlandırmak gerekli değildir. – nemesv

+0

Sayfa ilk yüklendiğinde doğrulama işleminin nasıl yapılmasını nasıl durdurabilirim? – DanScan