2012-07-17 18 views
52

नॉकआउट का उपयोग करते समय, सरल कार्यों के बजाय केवल पढ़ने के लिए गणना किए गए अवलोकनों का उपयोग करने का क्या फायदा है?नॉकआउट: गणना किए गए अवलोकन योग्य बनाम फ़ंक्शन

उदाहरण के लिए, निम्नलिखित viewmodel निर्माता और html स्निपेट लें: यहाँ

var ViewModel = function(){ 
    var self = this; 
    self.someProperty = ko.observable("abc"); 
    self.anotherProperty = ko.observable("xyz"); 
    self.someComputedProperty = function(){ 
     return self.someProperty() + self.anotherProperty(); 
    };  
}; 

<input data-bind="value: someProperty"/> 
<input data-bind="value: anotherProperty"/> 
<p data-bind="text: someComputedProperty()"></p> 

सब कुछ काम करने के लिए के रूप में आप उम्मीद थी लगता है, इसलिए वहाँ एक कारण है कि मैं बजाय का उपयोग करना चाहिए है:

​var ViewModel = function(){ 
    var self = this; 
    self.someProperty = ko.observable("abc"); 
    self.anotherProperty = ko.observable("xyz"); 
    self.someComputedProperty = ko.computed(function(){ 
     return self.someProperty() + self.anotherProperty(); 
    });  
}; 


<input data-bind="value: someProperty"/> 
<input data-bind="value: anotherProperty"/> 
<p data-bind="text: someComputedProperty"></p> 

मुझे पता है कि http://knockoutjs.com/documentation/computedObservables.html पर प्रलेखन बताता है कि "... घोषणात्मक बाइंडिंग को गणना किए गए अवलोकनों के रूप में कार्यान्वित किया जाता है", तो क्या इसका मतलब है कि मेरे विचारों में स्पष्ट रूप से उनका उपयोग करने की आवश्यकता है?

उत्तर

71

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

यहाँ कुछ चीजें अभिकलन observables बनाम एक समारोह

  • की एक गणना नमूदार कैश किया गया है मूल्य के बारे में विचार करने के लिए कर रहे हैं, इसलिए जब यह बनाई गई है और जब एक निर्भरता अद्यतन किया जाता है यह केवल अद्यतन किया जाता है। एक नियमित कार्य के लिए, आपको प्रत्येक बार तर्क निष्पादित करने की आवश्यकता होगी। यदि कई चीजें उस मान पर निर्भर करती हैं (कहें कि संग्रह में प्रत्येक आइटम माता-पिता से मूल्य के विरुद्ध बाध्यकारी है), तो यह तर्क बार-बार चल रहा होगा।

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

  • यदि अंततः आप सर्वर को मूल्य भेजना चाहते हैं, तो एक गणना किए गए अवलोकन आपके JSON आउटपुट में स्वाभाविक रूप से दिखाई देंगे, जबकि एक सामान्य फ़ंक्शन का परिणाम जो मान जेएसओएन में परिवर्तित हो जाता है (आपके पास होगा पहले उस समारोह से संपत्ति को पॉप्युलेट करने के लिए और अधिक काम करने के लिए)।

+0

ग्रेट उत्तर: धन्यवाद! – Duncan

+1

अच्छा जवाब। जब भी मैं पूर्ण तर्क को हर बार निष्पादित करना चाहता हूं, तो मैं कभी-कभी गणना की बजाय फ़ंक्शन का उपयोग करता हूं। –

+1

यह कैसे पता चलता है कि एक गणना किए गए अवलोकन योग्य एक और देखने योग्य पर निर्भर करता है, जब मैंने इसे पारित किया तो यह एक समारोह था? क्या यह उस कार्य को पार्स करता है! - मुझे लगता है कि नॉकआउट स्रोत कोड पढ़ने का समय – zod

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