मैं भी answered this in the forum।
<div data-bind="text: fullDomainName">test</div>
<script>
function SiteModel(rootUrl, data) {
var self = this;
self.rootUrl = rootUrl;
self.DomainName = ko.observable(data.DomainName);
self.IsSubDomain = ko.observable(data.IsSubDomain);
self.fullDomainName = ko.computed(self.fullDomainName, self);
}
SiteModel.prototype.fullDomainName = function() {
if (this.IsSubDomain() && this.DomainName()) { // bombs out here with "self.IsSubDomain is not a function"
return this.DomainName() + ".myCompanyWebsite.com";
}
else {
return this.DomainName();
}
};
var temp = new SiteModel("someurl", { DomainName: "extraCool" });
ko.applyBindings(temp);
</script>
मैं प्रोटोटाइप में समारोह में परिभाषित किया गया है और यह एक अभिकलन निर्माता में नमूदार कर दिया है:
यहाँ एक तरह से यह (jsFiddle example) करना है।
<div data-bind="text: fullDomainName">test</div>
<script>
Function.prototype.computed = function() {
this.isComputed = true;
return this;
};
Object.prototype.makeComputeds = function() {
for (var prop in this) {
if (this[prop] && this[prop].isComputed) {
this[prop] = ko.computed(this[prop], this, {deferEvaluation:true});
}
}
};
function SiteModel(rootUrl, data) {
var self = this;
self.rootUrl = rootUrl;
self.DomainName = ko.observable(data.DomainName);
self.IsSubDomain = ko.observable(data.IsSubDomain);
self.makeComputeds();
}
SiteModel.prototype.fullDomainName = function() {
if (this.IsSubDomain() && this.DomainName()) { // bombs out here with "self.IsSubDomain is not a function"
return this.DomainName() + ".myCompanyWebsite.com";
}
else {
return this.DomainName();
}
}.computed();
var temp = new SiteModel("someurl", { DomainName: "extraCool" });
ko.applyBindings(temp);
</script>
अभिकलन के अंतर्निहित पढ़ समारोह प्रोटोटाइप हालांकि वास्तविक गणना संपत्ति नहीं होगा द्वारा साझा किए जाएंगे:
यहाँ यह एक अधिक सामान्य तरीका (jsFiddle example) करने के लिए एक तरीका है। मुझे लगता है कि भ्रम हो सकता है यदि आपने कुछ ऑब्जेक्ट बनाए हैं और फिर फ़ंक्शन को प्रोटोटाइप में बदल दिया है। नई वस्तुएं नए फ़ंक्शन का उपयोग करेंगी, लेकिन पुरानी ऑब्जेक्ट्स नहीं होगी।
चूंकि गणना किए गए अवलोकन योग्य गुण हैं, इसलिए आपको की अपेक्षा नहीं करनी चाहिए कि उन्हें प्रोटोटाइप के माध्यम से मौजूदा ऑब्जेक्ट्स में जोड़ सकें।
स्रोत
2012-04-28 02:22:02
मुझे लगता है कि यह आसानी से संभव नहीं है। बात यह है कि 'गणना' एक ऐसा फ़ंक्शन है जिसमें निम्न हस्ताक्षर हैं: 'ko.computed (Func, ऑब्जेक्ट) 'जहां ऑब्जेक्ट एक ** उदाहरण ** है जिसे गणना समारोह के' इस 'संदर्भ में पारित किया गया है। –
Oybek
मैंने यह भी कोशिश की लेकिन यह काम नहीं किया: 'SiteModel.prototype.fullDomainName = ko.computed (function() { \t ... }, SiteModel.prototype); 'मैंने यह भी देखा कि समारोह के दौरान कार्य निष्पादित हो रहा है पेज लोड जो मुझे लगता है वह इस मुद्दे का दिल है। ऑब्जेक्ट के उदाहरण के बाद इसे निष्पादित करना चाहिए। क्या इस परिदृश्य में फ़ंक्शन निष्पादित करने से रोकने के लिए नॉकआउट कोड को संशोधित करने का कोई तरीका है? – TugboatCaptain