2012-10-03 6 views
10

नॉकआउट v2.1.0 डिबग स्रोत कोड से:Knockout.js की डिफ़ॉल्ट समानता तुलनाकर्ता गैर-आदिम प्रकारों का बराबर क्यों नहीं मानता है?

ko.observable['fn'] = { 
    "equalityComparer": function valuesArePrimitiveAndEqual(a, b) { 
     var oldValueIsPrimitive = (a === null) || (typeof(a) in primitiveTypes); 
     return oldValueIsPrimitive ? (a === b) : false; 
    } 
}; 

यह मेरे लिए unintuitive लगता है, लेकिन किसी कारण स्टीव सैंडरसन अपने रास्ते से बाहर चला गया इस परिभाषित करने के लिए होना चाहिए। यह मामला क्यों होगा? ऐसा लगता है कि अनावश्यक रूप से परिवर्तन अधिसूचनाएं ट्रिगर होती हैं।

+0

महान सवाल! शायद मैं पर्याप्त केओ को समझ नहीं पा रहा हूं, लेकिन उपर्युक्त कोड कैसे अधिसूचनाओं को बदलता है? –

उत्तर

4

ऐसा इसलिए किया गया था क्योंकि यदि आपके पास कोई ऑब्जेक्ट धारण करने योग्य है, तो नॉकआउट यह नहीं जानता कि उप-गुण बदल गए हैं या नहीं।

इस बिंदु पर, हम किसी ऑब्जेक्ट के गुणों में से किसी एक के मामले में एक अधिसूचना ट्रिगर करते हैं।

+0

क्या यह केवल उस मामले में सहायता नहीं करेगा कि एक अवलोकन योग्य मूल्य के साथ फिर से सेट किया गया हो? जैसे यदि आपके पास 'var obj = {name: 'डेविड'} है; var x = ko.observable (obj); 'फिर आप' obj.name = 'बॉब' कहते हैं; 'यह एक अधिसूचना ट्रिगर नहीं करेगा, केवल तभी जब आप' x (obj) कहते हैं; 'बाद में यह एक बदलाव पर सूचित करेगा सही बात? – Davy8

+0

ठीक है, यह सही है। आप 'x.valueHasMutated()' –

+3

भी कॉल कर सकते हैं जो मेरे लिए एक बहुत ही सीमित उपयोग-मामले की तरह लगता है, और मेरे लिए यह अप्रत्याशित व्यवहार है कि मुझे समझने के लिए स्रोत कोड को देखना पड़ा। क्या यह एक मुद्दा था जो केओ का उपयोग करने में बहुत कुछ हुआ? ऐसा लगता है कि सामान्य समानता जांच केवल उन लोगों के लिए समस्याएं पैदा करती है जो समझ में नहीं आती कि वस्तु समानता कैसे काम करती है। – Davy8

0

यदि आपके पास एक ऑब्जेक्ट धारण करने वाला एक अवलोकन योग्य है, तो आप अपनी आवश्यकताओं के आधार पर समानता वापस करने के लिए एक कस्टम समानता कॉम्पैडर बना सकते हैं। बस उस अवलोकन योग्य उदाहरण पर संपत्ति सेट करें जिसे आप कस्टमाइज़ करना चाहते हैं। हस्ताक्षर है:

myObservable["equalityComparer"] = function(a, b){ 
    return a===b;// Or any arbitrary comparison 
}; 

अब आप अपने नमूदार केवल, परिवर्तन घटना बढ़ा रहा है जब समारोह झूठी लौटा रहा है।

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