2012-04-23 12 views
7

पर प्रोटोटाइप के माध्यम से एक गणना किए गए अवलोकन योग्य को जोड़ना मैं नॉकआउट.जेएस 2.0 का उपयोग कर रहा हूं और मैं एक रचनात्मक अवलोकन करने के द्वारा बनाए गए कन्स्ट्रक्टर फ़ंक्शन के प्रोटोटाइप को बढ़ाने का प्रयास कर रहा हूं लेकिन इसे "स्वयं ISSubDomain एक समारोह नहीं है "। मैं इस त्रुटि को कैसे हल करूं? क्या इसे हल करने के लिए एक कन्स्ट्रक्टर फ़ंक्शन का विस्तार करने का कोई और तरीका है?एक कन्स्ट्रक्टर फ़ंक्शन

http://jsfiddle.net/StrandedPirate/J44S4/3/

नोट: मैं जानता हूँ कि मैं निर्माता समारोह के बंद होने के अंदर नमूदार गणना की है, लेकिन मैं नॉकआउट दृश्य मॉडल के लिए एक स्वचालित कोड जनरेटर का निर्माण कर रहा हूँ निर्धारित कर सकते हैं और मैं प्रोटोटाइप के माध्यम से अपने वस्तुओं का विस्तार करने में सक्षम होना चाहिए संपत्ति।

+0

मुझे लगता है कि यह आसानी से संभव नहीं है। बात यह है कि 'गणना' एक ऐसा फ़ंक्शन है जिसमें निम्न हस्ताक्षर हैं: 'ko.computed (Func , ऑब्जेक्ट) 'जहां ऑब्जेक्ट एक ** उदाहरण ** है जिसे गणना समारोह के' इस 'संदर्भ में पारित किया गया है। – Oybek

+0

मैंने यह भी कोशिश की लेकिन यह काम नहीं किया: 'SiteModel.prototype.fullDomainName = ko.computed (function() { \t ... }, SiteModel.prototype); 'मैंने यह भी देखा कि समारोह के दौरान कार्य निष्पादित हो रहा है पेज लोड जो मुझे लगता है वह इस मुद्दे का दिल है। ऑब्जेक्ट के उदाहरण के बाद इसे निष्पादित करना चाहिए। क्या इस परिदृश्य में फ़ंक्शन निष्पादित करने से रोकने के लिए नॉकआउट कोड को संशोधित करने का कोई तरीका है? – TugboatCaptain

उत्तर

5

मैं भी 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) करने के लिए एक तरीका है। मुझे लगता है कि भ्रम हो सकता है यदि आपने कुछ ऑब्जेक्ट बनाए हैं और फिर फ़ंक्शन को प्रोटोटाइप में बदल दिया है। नई वस्तुएं नए फ़ंक्शन का उपयोग करेंगी, लेकिन पुरानी ऑब्जेक्ट्स नहीं होगी।

चूंकि गणना किए गए अवलोकन योग्य गुण हैं, इसलिए आपको की अपेक्षा नहीं करनी चाहिए कि उन्हें प्रोटोटाइप के माध्यम से मौजूदा ऑब्जेक्ट्स में जोड़ सकें।

+1

आपका दूसरा फिडल ऐसा करने का एक अच्छा तरीका हो सकता है, लेकिन आपका अधिकार, मुझे प्रोटोटाइप में गुण जोड़ने की कोशिश नहीं करनी चाहिए, उन्हें कन्स्ट्रक्टर फ़ंक्शन में रहना चाहिए क्योंकि उन्हें इंस्टाल किया जाएगा। – TugboatCaptain

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