Ko.utils.unwrapObservable का उपयोग कब करें?


114

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

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

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

जवाबों:


142

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

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


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

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

17
आपको नहीं पता कि आप एक बाध्यकारी में एक अवलोकन योग्य या गैर-अवलोकन योग्य पारित हो रहे हैं। कहते हैं कि मेरे पास myBindingकोई है और जैसे बांधता है data-bind="myBinding: myValue"myValueयह एक अवलोकन योग्य हो सकता है या यह केवल दृश्य मॉडल पर एक सादे संपत्ति हो सकती है। यदि यह सिर्फ एक संपत्ति है और मैं इसे एक फ़ंक्शन की तरह कहता हूं, तो आपको एक त्रुटि मिलेगी। ko.utils.unwrapObservableसुरक्षित रूप से आपको मान लौटाएगा, भले ही आप एक अवलोकन योग्य पारित किए गए थे या नहीं।
आरपी नीमरियर

10
मैं भी 'ko.unwrap' शॉर्टहैंड का उपयोग करने की सलाह दूंगा क्योंकि 'ko.utils.unwrapObservable' एक बहुत लंबी अभिव्यक्ति है।
इवान निकितिन

3
@IvanNikitin - निश्चित रूप से, यह इंगित करना चाहता था कि ko.unwrap3.0+ में उपलब्ध है। यदि आप 3.0 से अधिक पुराने का उपयोग कर रहे हैं, तो ko.utils.unwrapObservableअभी भी है।
आरपी नीमरियर

12

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

निम्नलिखित पुनरावृत्ति पूर्वव्यापी सब कुछ:

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

यहाँ एक सरल कस्टम बाइंडिंग का एक उदाहरण मैंने लिखा है:

//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
        }
    }
}

इस तरह बाइंडिंग वैल्यू में हमेशा एक वैल्यू होती है। मुझे इस बात की चिंता करने की आवश्यकता नहीं है कि क्या मैं एक समारोह में, एक अवलोकन योग्य, एक मूल्य, या एक अवलोकन के अंदर भी एक समारोह में पारित हुआ। यह तब तक सब कुछ ठीक से खोल देगा जब तक कि यह उस वस्तु को प्राप्त न कर ले जो मुझे चाहिए।

आशा है कि किसी की मदद करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.