अपने दृश्य मॉडल को परिभाषित करने के लिए फ़ंक्शन का उपयोग करने के कुछ फायदे हैं।
मुख्य लाभ यह है कि आपके पास thisउस मूल्य के लिए तत्काल पहुंच है जो बनाए जा रहे उदाहरण के बराबर है। इसका मतलब है कि आप कर सकते हैं:
var ViewModel = function(first, last) {
this.first = ko.observable(first);
this.last = ko.observable(last);
this.full = ko.computed(function() {
return this.first() + " " + this.last();
}, this);
};
तो, आपकी गणना की गई वेधशाला उपयुक्त मान के लिए बाध्य हो सकती है this, भले ही उसे अलग-अलग दायरे से कहा जाए।
एक वस्तु शाब्दिक के साथ, आपको करना होगा:
var viewModel = {
first: ko.observable("Bob"),
last: ko.observable("Smith"),
};
viewModel.full = ko.computed(function() {
return this.first() + " " + this.last();
}, viewModel);
उस स्थिति में, आप viewModelसीधे अभिकलन में उपयोग कर सकते हैं , लेकिन इसका तत्काल (डिफ़ॉल्ट रूप से) मूल्यांकन किया जाता है, इसलिए आप इसे ऑब्जेक्ट शाब्दिक के भीतर परिभाषित नहीं कर सकते, जैसा viewModelकि ऑब्जेक्ट के शाब्दिक बंद होने तक परिभाषित नहीं किया गया है। बहुत से लोगों को यह पसंद नहीं है कि आपके व्यू मॉडल का निर्माण एक कॉल में एनकैप्सुलेटेड न हो।
एक और पैटर्न जिसे आप यह सुनिश्चित करने के लिए उपयोग कर सकते हैं कि thisहमेशा उचित मूल्य के बराबर फ़ंक्शन में एक चर सेट करना है thisऔर इसके बजाय इसका उपयोग करना है। यह इस तरह होगा:
var ViewModel = function() {
var self = this;
this.items = ko.observableArray();
this.removeItem = function(item) {
self.items.remove(item);
}
};
अब, अगर आप अलग आइटम और कॉल के दायरे में हैं $root.removeItem, का मूल्य thisइच्छा वास्तव में होना डेटा उस स्तर (जो आइटम होगा) पर बाध्य किया जा रहा। इस मामले में स्वयं का उपयोग करके, आप यह सुनिश्चित कर सकते हैं कि इसे समग्र दृश्य मॉडल से हटाया जा रहा है।
एक अन्य विकल्प का उपयोग कर रहा है bind, जो आधुनिक ब्राउज़रों द्वारा समर्थित है और यदि यह समर्थित नहीं है, तो KO द्वारा जोड़ा जाता है। उस मामले में, ऐसा लगेगा:
var ViewModel = function() {
this.items = ko.observableArray();
this.removeItem = function(item) {
this.items.remove(item);
}.bind(this);
};
इस विषय पर और भी बहुत कुछ कहा जा सकता है और कई पैटर्न जिन्हें आप खोज सकते हैं (जैसे मॉड्यूल पैटर्न और खुलासा मॉड्यूल पैटर्न), लेकिन मूल रूप से एक फ़ंक्शन का उपयोग करने से आपको अधिक लचीलापन और नियंत्रण मिलता है कि ऑब्जेक्ट कैसे बनता है और संदर्भ की क्षमता। चर जो उदाहरण के लिए निजी हैं।
prototype(वे विधियां जो अक्सर, उदाहरण के लिए, सर्वर से डेटा प्राप्त करते हैं और तदनुसार दृश्य मॉडल को अपडेट करते हैं)। हालाँकि आप अभी भी स्पष्ट रूप से उन्हें एक वस्तु शाब्दिक संपत्ति के रूप में घोषित कर सकते हैं, इसलिए मैं वास्तव में अंतर नहीं देख सकता।