2015-05-19 5 views
29

computed और pureComputed के बीच नॉकआउटजेएस में क्या अंतर है?नॉकआउटजेएस: गणना बनाम शुद्ध कॉम्प्यूटेड

क्या मैं computed के बजाय सुरक्षित रूप से pureComputed का उपयोग कर सकता हूं?

+5

क्या आपने दस्तावेज़ों को पढ़ा है: http://knockoutjs.com/documentation/computed-pure.html – Luis

+2

@Luis मुझे समझ में नहीं आता कि गणना में कार्रवाइयां होने पर हम 'शुद्ध कॉम्प्यूटेड' का उपयोग क्यों नहीं करना चाहिए। – mehrandvd

+2

आपको दस्तावेज़ों को पढ़ना चाहिए, और फिर उन दस्तावेज़ों के बारे में पूछें जिन्हें आप समझ नहीं सकते हैं, जैसा कि है, आप लोगों के लिए उन्हें पढ़ने के लिए कह रहे हैं और आपको एक tldr – Luis

उत्तर

15

मैं @Jeroen से सहमत है और मैं जे मुनरो के book जो मुझे बहुत मदद की तो यह रूप में अच्छी तरह से दूसरों के लिए उपयोगी हो सकता है से एक छोटी उदाहरण जोड़ना चाहते हैं।

सबसे पहले, शुद्ध कॉम्प्यूटेड वेबल्स कई प्रदर्शन और स्मृति सुधारों के साथ गणना किए गए अवलोकनों के समान हैं। नाम Pure function प्रोग्रामिंग शब्द से उधार लिया गया है और इसका मतलब यह है कि कोई भी फ़ंक्शन जो केवल स्थानीय चर का उपयोग करता है वह संभावित रूप से शुद्ध है, जबकि गैर-स्थानीय चर का उपयोग करने वाला कोई भी कार्य संभावित रूप से अशुद्ध है।

Knockout.js में अवलोकनों का अलग-अलग व्यवहार किया जाता है। इस प्रकार pureComputed अवलोकनों को एक नींद मोड में रखा जाता है (नॉकआउट सभी निर्भरताओं को घेरता है और पढ़ने के बाद सामग्री का फिर से मूल्यांकन करता है) और गणना किए गए अवलोकनों को सुनने के मोड में रखा जाता है (नॉकआउट लगातार जांचता है कि मूल्य पहली पहुंच से पहले अद्यतित है या नहीं) ।

इसलिए, यदि आपको अन्य कोड निष्पादित करने की आवश्यकता है, तो एक गणना किए गए अवलोकनों का उपयोग करने के लिए बेहतर है।

function ViewModel() { 
    var self = this; 

    self.firstName = ko.observable('Arshile'); 
    self.lastName = ko.observable('Gorky'); 
    self.pureComputedExecutions = 0; 
    self.computedExecutions = 0; 

    self.pureComputedFullName = ko.pureComputed(function() { 
     // This is NOT recommended 
     self.pureComputedExecutions++; 
     return 'Hello ' + self.firstName() + ' ' + self.lastName(); 
    }); 
    self.computedFullName = ko.computed(function() { 
     self.computedExecutions++; 

     return 'Hello ' + self.firstName() + ' ' + self.lastName(); 
    }); 
}; 
var viewModel = new ViewModel(); 
ko.applyBindings(viewModel); 

alert('Pure computed executions: ' + viewModel.pureComputedExecutions); 
alert('Computed executions: ' + viewModel.computedExecutions); 

जब यह कोड चलता है, दो चेतावनी संदेश प्रदर्शित होते हैं कि समय की संख्या pureComputed दिखाने और गणना कार्यों कहा जाता है। चूंकि pureComputed नींद मोड में है, तो फ़ंक्शन को कभी भी एक्सेस नहीं किया गया है, और काउंटर विइल प्रदर्शित करता है 0. इसके विपरीत, गणना किए गए फ़ंक्शन का स्वचालित रूप से डेटा बाइंडिंग पर मूल्यांकन किया जाता है, जिससे काउंटर संख्या बढ़ता है और प्रदर्शित होता है।

+1

"सभी निर्भरताओं को झुकाव" से आपका क्या मतलब है? –

+0

स्टोर निर्भरताएं और बाद में जांचता है – johannesMatevosyan

23

वे बहुत समान हैं। The difference is कि pureComputed में कुछ प्रदर्शन अनुकूलन हैं, और जो इसके परिवर्तनों को ट्रैक कर रहा है उसके बारे में स्मार्ट होने के कारण मेमोरी लीक को रोकने की कोशिश करता है।

आप कई मामलों में pureComputed के साथ सुरक्षित रूप से computed को प्रतिस्थापित कर सकते हैं। गणना should follow this:

1. गणना किए गए अवलोकन योग्य का मूल्यांकन किसी भी दुष्प्रभाव का कारण नहीं बनना चाहिए।

2. गणना किए गए अवलोकन योग्य का मूल्य मूल्यांकन या अन्य "छिपी हुई" जानकारी के आधार पर भिन्न नहीं होना चाहिए। इसका मूल्य पूरी तरह से आवेदन में अन्य अवलोकनों के मूल्यों पर आधारित होना चाहिए, जो शुद्ध कार्य परिभाषा के लिए, इसके मानकों को माना जाता है।

तो एक सामान्य नियम के, किसी भी नमूदार गणना की है कि बस स्पष्ट रूप से बदल देती है कुछ नियमित observable गुण एक pureComputed रूप में ठीक किया जाना चाहिए, अन्यथा computed साथ छड़ी के रूप में।

The documentation has decent explanations जब आपको pureComputed अवलोकनों का उपयोग क्यों करना चाहिए। यहां एक प्रासंगिक अंश दिया गया है:

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

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

+0

मुझे समझ में नहीं आता है कि कार्रवाई के दौरान हम शुद्ध कॉम्प्यूटेड का उपयोग क्यों नहीं करना चाहिए गणना में – mehrandvd

+0

ऐसा नहीं लगता कि मैं इसे दस्तावेज़ीकरण के मुकाबले ज्यादा बेहतर समझा सकता हूं। मैंने आपकी टिप्पणी में प्रश्न से संबंधित कुछ प्रासंगिक उद्धरण जोड़े हैं, लेकिन आगे के प्रश्न/विवरण के लिए मैं आपको दस्तावेज़ीकरण को सावधानीपूर्वक पढ़ने की सलाह देता हूं। यदि, उसके बाद भी आपको संदेह है, वास्तविक स्रोत कोड के साथ-साथ प्रयोग करना शायद यहां पूछने से अधिक व्यवहार्य विकल्प हैं। – Jeroen

+5

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

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