2012-03-08 21 views
106

मैंने नॉकआउटजेएस का उपयोग करके कुछ कस्टम बाइंडिंग लिखी हैं। मुझे अभी भी अनिश्चितता है कि ko.util.unwrapObservable(item) का उपयोग करने के लिए कोड को देखते हुए, कॉल मूल रूप से यह देखने के लिए जांचता है कि item एक अवलोकन योग्य है या नहीं। यदि ऐसा है, तो मान() को वापस करें, यदि यह नहीं है, तो बस मान वापस करें। कस्टम बाइंडिंग बनाने के बारे में नॉकआउट पर खंड को देखते हुए, वे निम्नलिखित वाक्य रचना है:ko.utils.unwrapObservable का उपयोग कब करें?

var value = valueAccessor(), allBindings = allBindingsAccessor(); 
var valueUnwrapped = ko.utils.unwrapObservable(value); 

इस मामले में, वे () के माध्यम से नमूदार आह्वान लेकिन फिर भी ko.utils.unwrapObservable कहते हैं। मैं बस एक बनाम दूसरे का उपयोग करने पर एक संभाल पाने की कोशिश कर रहा हूं या अगर मुझे हमेशा उपर्युक्त पैटर्न का पालन करना चाहिए और दोनों का उपयोग करना चाहिए।

उत्तर

135

आपको उन मामलों में ko.utils.unwrapObservable का उपयोग करना चाहिए जहां आपको नहीं पता कि आपको एक अवलोकन योग्य है या नहीं। यह आम तौर पर एक कस्टम बाध्यकारी में होगा जहां एक अवलोकन योग्य या गैर-देखने योग्य इसके खिलाफ बाध्य किया जा सकता है।

आपके ऊपर दिए गए कोड में, valueAccessor() पर कॉल वास्तव में एक अवलोकन योग्य नहीं है। यह केवल उस संदर्भ को पुनर्प्राप्त कर रहा है जो सही संदर्भ में बाध्यकारी को पारित किया गया था (यह किसी फ़ंक्शन में इसे संरक्षित करने के लिए लपेटा जाता है)। valueAccessor() का वापसी मूल्य एक अवलोकन या नहीं हो सकता है। यह बाध्यकारी को जो कुछ भी पारित किया गया था।

+0

तो क्या पैटर्न मैंने कस्टम बाइंडिंग के लिए आगे बढ़ने के लिए सबसे अच्छा अभ्यास पोस्ट किया है? – arb

+4

यह वास्तव में स्थिति पर निर्भर करता है। कुछ कस्टम बाइंडिंग केवल अवलोकनों के साथ काम करने के लिए डिज़ाइन की गई हैं, इसलिए आप सामने (ko.isObservable) की जांच कर सकते हैं कि यह एक अवलोकन योग्य है और फिर आप इसे() के साथ खोलने के लिए स्वतंत्र होंगे। यदि आपको ऑब्जेक्ट प्राप्त हो रहा है जिसमें घोंसला वाले अवलोकन हो सकते हैं, तो आप ऑब्जेक्ट का अनचाहे संस्करण प्राप्त करने का प्रयास कर रहे हैं, तो आप 'ko.utils.unwrapObservable' का उपयोग करने के बजाय 'ko.toJS (yourObject)' करने से बेहतर हैं। एक विजेट या तृतीय पक्ष पुस्तकालय में जाने के लिए। आम तौर पर, अवलोकन और गैर-अवलोकनों का समर्थन करने के लिए 'ko.utils.unwrapObservable' का उपयोग करना सबसे सुरक्षित है। –

+2

मुझे लगता है कि मैं उलझन में हूं कि 'ko.utils.unwrapObservable' का उद्देश्य क्या है। कोड को देखते हुए, यह देखने के लिए जांच करता है कि यह देखने योग्य है और यदि यह है, तो नॉकआउट अवलोकन योग्य मान प्राप्त करने के लिए '() 'को आमंत्रित करता है, अन्यथा, यह गैर-देखने योग्य के लिए मूल्य देता है। यदि मुझे दिलचस्पी है तो बाध्यकारी में पारित डेटा का मूल्य है, मैं हमेशा '()' का उपयोग क्यों नहीं कर सकता? – arb

9

पहले का जवाब सही है, लेकिन अक्सर मैं कस्टम बाइंडिंग (एक फ़ंक्शन जो अनुमतियों की जांच करता है, या यह निर्धारित करता है कि किसी और चीज़ के आधार पर क्या करना है)। जो भी मुझे वास्तव में जरूरी था वह किसी भी समारोह को खोलना था, भले ही यह एक अवलोकन योग्य न हो।

निम्नलिखित रिकर्सिवली unwraps सब कुछ:

//replaces single and double 'smart' quotes users commonly paste in from word into textareas and textboxes with normal text equivalents 
//USAGE: 
//data-bind="replaceWordChars:true 
//also works with valueUpdate:'keyup' if you want" 

ko.bindingHandlers.replaceWordChars = { 
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
     var bindingValue = ko.utils.unwrapFunction(valueAccessor); 

     if (bindingValue) { 
      $(element).val(removeMSWordChars(allBindingsAccessor().value())); //update DOM - not sure why I should need to do this, but just updating viewModel doesn't always update DOM correctly for me 
      allBindingsAccessor().value($(element).val()); //update viewModel 
     } 
    } 
} 

इस तरह bindingValue हमेशा एक मूल्य में शामिल है:

ko.utils.unwrapFunction = function (func) { 
    if (typeof func != 'function') { 
     return func; 
    } 
    else { 
     return ko.utils.unwrapFunction(func()); 
    } 
}; 

यहाँ बाध्यकारी एक सरल कस्टम का एक उदाहरण मैंने लिखा है। मुझे इस बारे में चिंता करने की ज़रूरत नहीं है कि क्या मैं एक समारोह में एक अवलोकन, एक मूल्य, या यहां तक ​​कि एक समारोह में एक समारोह में पारित किया। यह ऑब्जेक्ट पर तब तक सबकुछ ठीक से अनदेखा कर देगा जब तक कि मैं उस ऑब्जेक्ट पर न हो।

उम्मीद है कि किसी की मदद करता है।

+9

में मदद की है, मैं कुछ भी ओवरराइट नहीं कर रहा हूं, अनचाहे ऑब्जेक्टिव अभी भी है, मेरा अनचाहे फ़ंक्शन कहा जाता है। ko.utils इस के लिए एक लॉजिकल नेमस्पेस है क्योंकि यह एक नॉकआउट यूटिलिटी फ़ंक्शन है। मैं इसे थोड़ा गन्दा मानता हूं, लेकिन उसी नाम के लिए इसे नामस्थान में डालने का फैसला किया क्योंकि मैपिंग प्लगइन स्वयं को को नेमस्पेस में रखता है, हालांकि यह नहीं आता है, इसके लिए सिर्फ एक नया नामस्थान होना उचित नहीं लगता है। – pilavdzice

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