2012-02-23 9 views
10

मैंने देखा है negating है कि KnockoutJS कि बाध्यकारी काम नहीं करता है मूल्य अगर यह नकार दिया गया में:क्यों knockoutjs में एक बाँध मूल्य unwrapped किया जाना है

तो जैसे:

data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled }" 

नहीं करता ' सही ढंग से नकारात्मक addButtonEnabled चर उठाओ टी।

बहरहाल, यह करता है काम:

data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled() }" 

ऐसा क्यों है यह, unwrapped किया जाना है, जहां अन्य नहीं है है कि है?

मैं नॉकआउट 1.2.1 का उपयोग कर रहा हूं।

उत्तर

15

मुझे बताएं कि आपके उदाहरण में केओ पार्स बाइंडिंग कैसे करें।

वास्तव में डेटा-बाइंड में JSON शामिल है। केओ इसे {} प्रतीकों के साथ लपेटता है और सामान्य जेएस कोड के रूप में मूल्यांकन करता है। अपने उदाहरण KO में मूल्यांकन के बाद इस वस्तु मिल गया:

{ 
    showTip: enableTip, 
    css: { disabled: !addButtonEnabled } 
} 

css bindingHandler नोड बंधन को और bindingAccessor समारोह लागू किया जाना चाहिए प्राप्त करता है।

इस फ़ंक्शन के मूल्यांकन के बाद हमें css बाइंडिंग के लिए "तर्क" मिलता है। जो वस्तु को

{ disabled: !addButtonEnabled } 

फिर इस ऑब्जेक्ट के गुणों के माध्यम से css bindingHandler दोहराता इसी शैली स्थापित करने के लिए बराबर है। जब disabled संपत्ति की बात आती है तो हमें इसके लिए मूल्य पढ़ने की आवश्यकता होती है।

आमतौर पर सभी मानक बाइंडिंग इस तरह से मूल्य पढ़ते हैं: ko.utils.unwrapObservable(value) जो value देता है यदि value इस अवलोकन चर में संग्रहीत या मूल्य संग्रहीत नहीं है।

आपके मामले में value = !addButtonEnabled। जैसा कि आप देख सकते हैं !addButtonEnabled जावास्क्रिप्ट अभिव्यक्ति है, देखने योग्य नहीं है। तो यह सिर्फ इस अभिव्यक्ति का मूल्यांकन करता है। तो वास्तव में आपका बटन हमेशा observable() != false के बाद सक्षम है।

आपके दूसरे मामले में मूल्यांकन किए जाने वाले मूल्य में देखने योग्य मूल्य शामिल है, इसलिए यह सही काम करता है।

मुझे लगता है कि आप

+0

बहुत उपयोगी हैं। धन्यवाद! – GRGodoi

+0

मुझे पता है कि यह पुराना है, लेकिन मैं इसे खोज रहा था क्योंकि 'अक्षम: अवलोकन योग्य 1 || अवलोकन करने योग्य 2 को उन अवलोकनों में से किसी एक की आवश्यकता नहीं है, लेकिन मुझे उम्मीद है कि उन्हें आपके उत्तर में दिए गए कारणों के लिए चाहिए - बाइंडिंग जावास्क्रिप्ट अभिव्यक्ति के लिए है, न केवल एक अवलोकन योग्य। – xdumaine

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