2013-10-21 2 views
5

वर्तमान में मेरे पास दो नॉकआउट एक्सटेंशन फ़ंक्शन हैं। एक पर्यवेक्षक को एक सदस्य जोड़ता है जबकि दूसरा पढ़ने और लिखने के कार्यों को रोकता है।नॉकआउट एक्सटेंशन में बनाए गए कस्टम गुणों को संरक्षित करने के लिए एक अच्छा पैटर्न क्या है?

विस्तार विधियों को संयोजित करते समय एप्लिकेशन के आदेश का अवांछित प्रभाव होता है।

नीचे सरलीकृत कोड उदाहरण।

ko.extenders.format = function(target) { 
    var result = ko.computed(function(){ 
     return "$" + target(); 
    }); 

    target.formatted = result; 

    return target; 
}; 

ko.extenders.numeric = function(target, precision) { 
    var result = ko.computed({ 
     read: function() { 
      var current = parseFloat(target()); 
      return current.toFixed(precision); 
     }, 
     write: function(newValue) { 
      newValue = parseFloat(newValue); 
      target(newValue.toFixed(precision)); 
     } 
    }); 

    return result; 
}; 
संख्यात्मक विधि मैं स्वरूपित सदस्य के लिए जाँच करें और नई गणना के लिए असाइन करें लेकिन मैं इसे अन्य विधि का ज्ञान देने के लिए नहीं करना चाहते हैं

। अगर मैं अवलोकन या एक्सटेंशन से अधिक सदस्यों को जोड़ने का फैसला करता हूं तो यह भी बनाए रखा नहीं जा सकता है।

if(target.hasOwnProperty("formatted")){ 
    result.formatted = target.formatted; 
} 

हैऑनप्रॉपर्टी फिक्स के बिना एक बेवकूफ़ है। http://jsfiddle.net/gs5JM/2/

ध्यान दें कि MyValue4 - प्रारूप: विस्तारक आवेदन के आदेश और स्वरूपित सदस्य के नुकसान के कारण खाली है।

क्या एक ही अंतिम परिणाम प्राप्त करने और कोड को अधिक लचीला बनाने के लिए एक बेहतर पैटर्न है?

उत्तर

1

समस्या यह है कि आपका format विस्तारक मूल अवलोकन करने योग्य और numeric एक नया बनाता है। तो format और numeric पूरी तरह से अलग अवलोकनों के साथ काम करते हैं। ऐसा लगता है कि आपको दोनों मामलों में मूल अवलोकन करने के लिए विचार करना चाहिए।

ko.extenders.numeric = function(target, precision) { 

    ko.computed(function(){ 
     var current = parseFloat(target()); 
     target(isNaN(current) ? 0 : current.toFixed(precision)); 
    }); 

    return target; 
}; 

बेनामी computed तत्काल मूल्यांकन के साथ target मूल्य परिवर्तन करने के लिए एक सदस्यता पैदा करेगा:

मैं अपने numeric इस तरह से फिर से लिखने होगा। मूल्यांकन फ़ंक्शन एक मूल्य को पार्स करने और लक्षित अवलोकन करने के लिए सटीक संख्यात्मक मान को पुन: असाइन करने का प्रयास करेगा।

http://jsfiddle.net/gs5JM/3/

नोट: You should not care about possible circular dependency because KO will not re-evaluate computed while it's already evaluating

+0

प्रतिक्रिया के लिए धन्यवाद। मुझे पता नहीं था कि एक अज्ञात ko.computed इस तरह से काम करेगा, लेकिन यह समझ में आता है। –

+0

यह एक लिखने विधि के साथ अवलोकन और गणना वाले क्षेत्रों के लिए बहुत अच्छा काम करता है, लेकिन जब यह केवल एक पठन विधि के साथ गणना की जाती है तो विफल हो जाती है। शुरुआती संख्यात्मक विस्तारक में मैंने एक पठन और लेखन कार्य दोनों शामिल किए थे, इसलिए मैं इसे दोनों परिदृश्यों में उपयोग कर सकता था। क्या आपके पास कोई सुझाव है यदि यह एक लिखने योग्य देखने योग्य नहीं है? –

+0

यह बहुत ही अजीब परिदृश्य होगा जब आपको केवल पढ़ने योग्य अवलोकनों में लिखने के लिए एक विस्तारक की आवश्यकता होती है। क्या आप विवरण में समझा सकते हैं? –

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

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