2012-06-07 17 views
8

मैं ऑब्जेक्ट्स की सरणी को सत्यापित करने के लिए knockout validation lib का उपयोग करने का प्रयास कर रहा हूं। यह मेरे लिए सरल नहीं है कि अवलोकनों की एक सरणी के लिए सत्यापन समूह कैसे बनाया जाए। एक ही रास्ता मैं यह काम कर करने में कामयाब रहे इस (JSFIDDLE included) की तरह है:किसी सरणी को कैसे सत्यापित करें?

var Note = function() { 
    var self = this; 
    self.name = ko.observable().extend({ required: true }); 
}; 

var viewModel = function() { 
    var self = this; 

    self.notes = ko.observableArray([new Note(), new Note()]); 

    self.validatedObservables = function() { 
     var arr = []; 
     ko.utils.arrayForEach(self.notes(), function(note) { 
      arr.push(note.name); 
     }); 
     return arr; 
    }; 

    self.errors = ko.validation.group(self.validatedObservables()); 

    self.submit = function() { 
     if (self.errors().length != 0) { 
      self.errors.showAllMessages(); 
     } 
    }; 

}; 

ko.applyBindings(new viewModel()); 

ऐसा लगता है मेरे दृष्टिकोण की तरह अनावश्यक रूप से अत्यधिक शब्द है। स्रोत कोड के अनुसार आप बस ko.validation.group के लिए एक नमूदार पारित कर सकते हैं:

self.errors = ko.validation.group(self.notes()); 

लेकिन यह काम नहीं करता।

उत्तर

14

समूह के लिए गहराई (रिकर्सिव) होने का एक कॉन्फ़िगरेशन विकल्प है। self.errors = ko.validation.group(self.notes(), {deep: true});

यहाँ

बेला अपडेट किया गया:: http://jsfiddle.net/KHFn8/4116/

Btw, जिस तरह से तुमने यह बहुत छोटा रूप में लिखा जा सकता है:

यह, उदाहरण के लिए विश्व स्तर पर ko.validation.init({ grouping: { deep: true } }) साथ या group कॉल अपने आप में या तो सेट किया जा सकता
self.errors = ko.validation.group(
    ko.utils.arrayMap(self.notes(), function(note) { return note.name })); 

संपादित: मेरे बेला नहीं रह गया है KO सत्यापन के नवीनतम संस्करण के साथ काम करता है। जब मैंने उत्तर दिया (जून 2012): http://jsfiddle.net/KHFn8/4117/

+0

ग्रेट, मैन, आप एक दिन बचाया! सिर्फ एक और चीज है। यह ठीक काम करता है, लेकिन यदि आप बाद में किसी सरणी में एक और उदाहरण जोड़ते हैं, तो यह समूह में शामिल नहीं है। [इस पहेली को देखें] (http://jsfiddle.net/KHFn8/340/) – Dziamid

+0

मुझे नॉकआउट के बारे में क्या पसंद है यह है कि इसमें आपके रास्ते पर खड़ा जादू नहीं है। फिर, मैंने अपनी समस्या हल की। कोड वर्बोज़ है लेकिन काम करता है - डायनामिक रूप से जोड़े गए आइटम अब सत्यापन में जोड़े गए हैं। [फिडल] (http://jsfiddle.net/KHFn8/344/)। – Dziamid

+0

-1: यह पहेली कोई सत्यापन नहीं करता है। –

2

मुझे टिप्पणी करने के लिए कम प्रतिष्ठा है, तो नवीनतम संस्करण का उपयोग करके यह वही पहेली है। तो यहाँ एक और जवाब आता है। एंटीशोक सीम द्वारा प्रदत्त फिडल के साथ उत्तर अब काम नहीं कर रहा है। (Knockout.js के लिए लिंक टूट गया था, लेकिन यह अभी भी काम नहीं कर रहा था कि फिक्सिंग और एक कार्यशील लिंक जोड़ने 3.0 पीटकर करने के बाद भी)

मैं ko.validation.group (लगभग) ko.computed और यह मिल गया जोड़ा उस तरह से काम कर रहा हूँ।

self.errors = 
    ko.computed(function() { 
     return ko.validation.group(self.notes(), { deep: true })}); 

http://jsfiddle.net/bezFR/17/ (अद्यतन)

मैं वहाँ यह करने के लिए एक बेहतर तरीका है, लेकिन अब के लिए यह मेरी समस्या का हल है, और मैं आगे एक बेहतर समाधान देखकर देख रहा हूँ सही करने की/अनुमान लगा रहा हूँ :)

संबंधित मुद्दे