2012-02-27 14 views
14

यह एक आदर्श स्थिति नहीं है, लेकिन एक और नॉकआउट बाध्यकारी के कारण मैं उपयोग कर रहा हूं, मैं ऐसी परिस्थिति में हूं जहां मुझे तत्व को देखने की आवश्यकता है, यदि यह वास्तव में कुछ भी बाध्य है।तत्व प्राप्त करें नॉकआउट के साथ एक अवलोकन योग्य है?

तो क्या ऐसा करने का कोई तरीका है?

== अपडेट ==

मैं बैठाना यह सवाल confuses किसी भी अतिरिक्त प्रसंग जोड़ने के लिए नहीं करना चाहता था, लेकिन के रूप में यह अपेक्षाओं के अनुरूप एक जवाब अधिक प्राप्त कर सकते हैं यहाँ परिदृश्य है।

मैं नॉकआउट सत्यापन बाध्यकारी का उपयोग कर रहा हूं, जो ko.validation.group(model) विधि का उपयोग कर सभी त्रुटियों का खुलासा करता है। हालांकि समस्या यह है कि केवल आपको टेक्स्ट त्रुटियों देता है, यह आपको कोई संदर्भ नहीं देता है कि मॉडल के किस हिस्से ने आपको त्रुटियां दी हैं। इसलिए मैंने स्रोत में एक छोटा सा परिवर्तन किया है ताकि अब प्रत्येक त्रुटि से जुड़े अवलोकन योग्य को वापस कर दिया जा सके, क्योंकि यह कुछ परिदृश्यों के लिए उपयोगी हो सकता है, लेकिन यहां से मुझे इसे तत्व से जोड़ने में सक्षम होना चाहिए ताकि मैं कुछ प्रदर्शित कर सकूं किसी प्रकार की ऑनलाइन सत्यापन।

नॉकआउट प्रमाणीकरण एक बहुत ही बुनियादी ऑनलाइन सत्यापन प्रदान करता है जहां यह आपके तत्व के बाद एक अवधि बनाता है और आप इसे एक वर्ग दे सकते हैं, लेकिन यह मेरी आवश्यकताओं के लिए बहुत बुनियादी है क्योंकि वर्तमान में हम प्रदर्शित करने के लिए क्यूटीप और अन्य अधिसूचना सिस्टम का उपयोग कर रहे हैं सत्यापन त्रुटियां, और इसके कारण मुझे डोम तत्व और त्रुटि प्राप्त करने में सक्षम होना चाहिए। अब तक मेरे पास एक अवलोकन और त्रुटि है, लेकिन मुझे उस अवलोकन करने योग्य ऑब्जेक्ट को टाई करने की आवश्यकता है (जो कि मॉडल से किसी भी ko.observable() प्रॉपर्टी को हो सकता है) इसके दिए गए डीओएम तत्व में, यदि उसके पास तत्व बाध्यकारी है।

जैसा कि मेरे पास एक वस्तु है और मैं मॉडल से प्रेरित सत्यापन का उपयोग कर रहा हूं, यूआई नहीं, समस्या वास्तव में एक कस्टम बाध्यकारी के माध्यम से हल नहीं किया जा रहा है। आदर्श रूप से मुझे एक तत्व में अवलोकन करने योग्य वस्तु (अज्ञात ko.observable()) से शादी करने में सक्षम होना चाहिए।

भी जाने के लिए नहीं विशेष परियोजना है, लेकिन मेरे वर्तमान परियोजना सार सत्यापन जहां घटनाओं (EventSystem.SendEvent(ValidationEvents.ValidationFailed, <element>, <error>) यानी) बंद निकाल दिया जाता है तो एक सत्यापन प्रणाली इन घटनाओं के लिए सुनता है और तत्व को त्रुटि बाँधती है, यह एक टूलटिप, एक ग्राउल शैली हो अधिसूचना, एक अलर्ट बॉक्स इत्यादि। इसलिए मैं मॉडल अवलोकनों से सत्यापन को चलाते समय इस अमूर्तता को रखने का सबसे अच्छा तरीका खोजने की कोशिश कर रहा हूं, ui के डोम तत्व (यानी jquery-ui)

== संपादित करें 2 ==

मुझे नॉकआउट प्रमाणीकरण अपने स्वयं के सत्यापन तत्वों को रखने के लिए अवलोकनों के तत्वों को जानता है, हालांकि वे मौजूदा वीए को वापस पिघलते हैं ल्यू बाध्यकारी, इसलिए मैं इसे बदलना चाहता हूं कि किसी भी सत्यापन तत्वों के लिए उनके isValidatable() विधि के आधार पर तत्वों को जोड़ने के लिए, कम से कम इस तरह से प्रत्येक त्रुटि के लिए मैं इसे एक अवलोकन करने के लिए जोड़ सकता हूं, और तत्व बाइंडिंग के साथ किसी भी अवलोकन के लिए मैं टाई कर सकता हूं उन्हें तत्वों के लिए, और यदि कोई नहीं है तो यह ठीक है कि वे केवल व्यापक सत्यापन त्रुटियां बनेंगे। मैं इस एक कोशिश दे देंगे के रूप में कुछ इस तरह (अभी तक जांच नहीं की) होना चाहिए:

if(utils.isValidatable(valueAccessor())) { 
    valueAccessor().extend({hasElementalBinding: true, elementalBinding: element}); 
} 
else { 
    valueAccessor().extend({hasElementalBinding: false}); 
} 

रेखा के आसपास registerValueBindingHandler में 250 से कम, मैं इस सवाल का कुछ समय के लिए खुला छोड़ देंगे अब बैठाना किसी और एक बेहतर समाधान है ।

+0

प्रासंगिक? http://stackoverflow.com/questions/8911544/how-to-get-the-elements-bound-to-a-model-in-knockoutjs –

+0

वास्तव में, यह केवल एक कस्टम बाध्यकारी के बारे में नहीं है, मैं एक परिदृश्य में हूं मेरे पास एक अवलोकन करने योग्य पहुंच है, लेकिन एक नया डोम तत्व जोड़ने की आवश्यकता है और यह जानना कि किस तत्व को बांधना है। – Grofit

+0

मुझे सच में लगता है कि आपको अपनी खुद की कस्टम सत्यापन बाध्यकारी लिखनी चाहिए, क्योंकि तब आपको एक तत्व मिलेगा और आप इसके साथ क्या कर सकते हैं इसके साथ कर सकते हैं। –

उत्तर

5

यह बहुत तेजी से नहीं होगा, तो मैं निश्चित रूप से परिणाम कैश होगा, लेकिन कुछ jQuery के गुण चयनकर्ताओं का उपयोग कर: http://api.jquery.com/attribute-contains-selector/

जाहिर है इस जीत ':

$('[data-bind*="Property"]') 

*= है विशेषता चयनकर्ता शामिल .subscribe विधि का उपयोग करके मैन्युअल रूप से सब्सक्राइब किए गए किसी भी चीज़ को पकड़ें, लेकिन मुझे यकीन नहीं है कि आप वैसे भी तत्वों से तत्वों को कैसे निकालेंगे।

अस्वीकरण: जबकि यह समाधान शायद काम करेगा, यह मेरे लिए एक भयानक विचार की तरह लगता है, मैं इसके बजाय एक कस्टम बाइंडिंग (टिप्पणियों में उल्लिखित) लिखूंगा या कुछ अन्य समाधान ढूंढूंगा।

+1

इस उदाहरण में आप संपत्ति कैसे प्राप्त कर सकते हैं? यह मेरी समस्या का क्रूक्स है, मेरे पास अवलोकन करने योग्य ऑब्जेक्ट इतना अवलोकन योग्य है() मुझे इसका मूल्य देता है, लेकिन यह 100 में से 1 अवलोकन योग्य हो सकता है, इसलिए मुझे आदर्श रूप से पता होना चाहिए कि अवलोकन योग्य वस्तु का कुछ विशिष्ट पहचान योग्य भाग है कि मैं डोम तत्व प्राप्त करने के लिए उपयोग कर सकता हूं, या भले ही इसे किसी भी तरह से देखने योग्य वस्तु से सीधे उजागर किया जा सके, क्योंकि इसे कवर के तहत इसका उपयोग करना चाहिए। मैं आवश्यकतानुसार अधिक संदर्भ के साथ इस सवाल को प्रदूषित नहीं करना चाहता था, लेकिन यह बेहतर समझा जा सकता है। – Grofit

+0

आह, तो उत्तर वर्तमान बाइंडिंग के साथ नहीं है। लेकिन आप आसानी से मूल्य या कुछ ऐसा करने के लिए कस्टम बाइंडिंग लिख सकते हैं जो डोम तत्वों की सूची को उजागर करता है। –

+0

आप 'value' बाइंडिंग के स्रोत में देख सकते हैं, कि यह वास्तव में DOM तत्व को सार्वजनिक रूप से बेनकाब नहीं करता है: https://github.com/SteveSanderson/knockout/blob/master/src/binding/defaultBindings.js –

18

मैंने ऊपर वर्णित कुछ के समान कुछ किया है।

data-bind="... myvalidationbinding: myobservable" 
तब मेरे बाध्यकारी हैंडलर में

मैं विस्तार नमूदार

ko.bindingHandlers.myvalidationbinding = { 
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
    valueAccessor().extend({element: element }); 
    } 
}; 

और अंत में अपने एक्सटेंशन

ko.extenders.element = function (target, element) { 
    target.DOMElement = element; 
} 

अब मैं की सदस्यता ले सकते है: मेरे डेटा-बाँध टैग एक कस्टम बाध्यकारी शामिल isValid() knockout.validation द्वारा दिया गया है और यदि मान्य नहीं है, तो उस तत्व को प्राप्त करें जिसे अवलोकन करने योग्य है और फिर इसे jQuery के साथ प्रयोग करें।

+3

यदि अवलोकन योग्य एक से अधिक तत्वों से बंधे हैं तो क्या होगा? – Milimetric

+0

जोन केटो उत्तर को एक ही अवलोकन में बाध्य कई तत्व जोड़ने के लिए उत्तर देता है: 'target.DOMElements = target.DOMElements || []; लक्ष्य। DOMElements.push (तत्व); ' – vfportero

+2

+1 क्या एक अद्भुत विस्तारक !! मुझे नहीं पता कि यह दृश्य मॉडल से डीओएम तत्व तक पहुंचने का एक अच्छा अभ्यास है, लेकिन मेरे मामले में, अभी, डिजाइन बहुत आसान है। – Samuel

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