2012-06-27 9 views
10

मैं निम्नलिखित CoffeeScript KnockoutjsCoffeeScript, नॉकआउट और नमूदार

class NewsItem 
    content: ko.observable("") 
    title: ko.observable("") 

    constructor: (data,dispForm) -> 
     @content data.get_item("content") 
     @title data.get_item("title") 
     @id = data.get_id() 

class NewsItemViewModel 
    collection: ko.observableArray() 

    loadAll: => 
      listEnumerator = items.getEnumerator()   
      while listEnumerator.moveNext() 
       currentItem = listEnumerator.get_current() 
       @collection.push new NewsItem currentItem, @list.get_defaultDisplayFormUrl() 
      return 

$ -> 
    viewModel = new NewsItemViewModel 
    ko.applyBindings viewModel 
    return 

के लिए जावास्क्रिप्ट उत्पन्न करने के लिए एचटीएमएल मैं इस कोड का उपयोग

<ul id="results" data-bind="template: {name: 'item_template', foreach: collection}"> 
</ul> 
<script id="item_template" type="text/x-jquery-tmpl"> 
<li> 
    <h3><a href="/" data-bind="text: title"></a></h3> 
    <p> 
     <textarea data-bind="value: content"></textarea> 
     <input type="button" value="save" data-bind="enable: content().length > 0"> 
    </p> 
</li> 
</script> 

हालांकि प्रस्तुत करना करने के लिए, HTML में सभी वस्तुओं के मूल्यों को दिखाने की है संग्रह में जोड़ा गया अंतिम समाचार Item।

कोई संकेत?

उत्तर

20

ठीक है, यह नुकसान CoffeeScript है में से एक हो सकता है:

class NewsItem 
    content: ko.observable("") 

यहाँ, आप एक संपत्ति "सामग्री" एक नमूदार वस्तु है कि के साथ एक नया वर्ग बना रहे हैं। यह निम्नलिखित जावास्क्रिप्ट में संकलित करता है:

var NewsItem = (function() { 
    function NewsItem() {} 
    NewsItem.prototype.content = ko.observable(""); 
    return NewsItem; 
})(); 

जैसा कि आप अब देख सकते हैं, संपत्ति "सामग्री" प्रोटोटाइप से जुड़ी है। इसका मतलब है: केवल एक अवलोकन योग्य है, प्रति उदाहरण एक नहीं। तो जब भी आप new NewsItem करते हैं, तो कन्स्ट्रक्टर प्रोटोटाइप में इस एकल को देखने योग्य अपडेट करता है, इसलिए सभी उदाहरणों के लिए एक ही मूल्य।

इसे हल करने के लिए, बस कन्स्ट्रक्टर में देखने योग्य बनाएं।

this.content = ko.observable(data.get_item("content")); 
+0

मुझे लगता है कि यह हमेशा होता है कि यह कैसे किया जाना चाहिए: (प्रासंगिक हिस्सा) में

class NewsItem constructor: (data,dispForm) -> @content = ko.observable data.get_item("content") 

संकलन: इस तरह, यह है, उदाहरण के लिए संलग्न प्रोटोटाइप नहीं मिलता है। – Tyrsius

+0

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

+3

मुझे लगता है कि कई बार आप एक स्थिर संपत्ति चाहते हैं, लेकिन यह अपवाद होना चाहिए, नियम नहीं। – Tyrsius