2012-08-30 25 views
6

मुझे यकीन है कि यह किसी के लिए एक आसान जवाब होगा।अवलोकन योग्य से हटाएंअरे- knockoutjs

@{ 
    var initialData = new JavaScriptSerializer().Serialize(Model); 
} 
var data = @Html.Raw(initialData); 
function ViewModel(data) { 
    var self = this; 
    self.Name = ko.observable(data.Name); 
    self.Items = ko.observableArray(data.Items); 
    self.addItem = function() { self.Items.push(""); }; 
    self.removeItem = function(data) { self.Items.remove(data); } 
} 
$(document).ready(function() {ko.applyBindings(new ViewModel(data)); }); 

और निम्नलिखित दृश्य:: मैं निम्नलिखित ViewModel है

<div> 
    Name: <span data-bind="text: Name"></span> 
</div> 
<div> 
    Items: <button data-bind="click: addItem">Add Item</button> 
</div> 
<div> 
    <table> 
     <tbody data-bind="template: { name: 'itemTemplate', foreach: Items }"></tbody> 
    </table> 
</div> 
<script type="text/html" id="itemTemplate"> 
    <tr> 
     <td> 
      <input data-bind="value: $data" /> 
      <a href="#" data-bind="click: function() {$parent.removeItem($data)}">Remove Item</a> 
     </td> 
    </tr> 
</script> 

सब कुछ removeItem को छोड़कर सही ढंग से काम करने लगता है। जब नई पंक्तियां जोड़ दी जाती हैं, और "आइटम निकालें" को खाली नई पंक्ति पर क्लिक किया जाता है, तो सभी नई पंक्तियों को इसके साथ हटा दिया जाएगा। मैंने इसे काम करने के लिए प्रयास करने के लिए कई नॉकआउट ट्यूटोरियल देखे हैं, और मेरी विधि एक वैध प्रयास प्रतीत होती है, लेकिन जाहिर है ... मुझे कुछ याद आना चाहिए। कोई सुझाव?

उत्तर

14

remove एरे के माध्यम से एक अवलोकन योग्य ऐरे लूप का कार्य और किसी भी आइटम को हटाए गए मान से मेल खाता है। आपके मामले में, आप केवल तारों से निपट रहे हैं और यह देखेंगे कि सभी नए (बिना मूल्य के) मेल खाते हैं।

  • तुम सिर्फ { value: ko.observable("") } तरह तार के बजाय वस्तुओं के साथ सौदा कर सकते हैं:

    के कुछ तरीके हैं इसे संभाल करने के लिए कर रहे हैं। फिर, जब आप $data पास करते हैं तो यह केवल उस वास्तविक आइटम को हटा देगा जो उस ऑब्जेक्ट संदर्भ से मेल खाता है। यदि आपका मान देखने योग्य नहीं है और डेटा स्वयं (संपत्ति नहीं है) है, तो आपके लेखन वास्तव में इसे आपके दृश्य मॉडल पर वापस नहीं लाएंगे।

  • यदि यह आपके परिदृश्य के लिए काम नहीं करता है, तो आप विभाजन का उपयोग कर इंडेक्स ($index) के आधार पर आइटम हटा सकते हैं।

शायद मैं इसे पसंद नहीं करेंगे: http://jsfiddle.net/rniemeyer/N3JaW/

भी ध्यान रखें कि event बाध्यकारी हैंडलर के लिए सबसे पहले तर्क के रूप में मौजूदा डेटा पारित करेंगे (clickevent करने के लिए एक आवरण है), तो आप सरल बना सकते हैं click: $parent.removeItem पर आपका बाध्यकारी।

अद्यतन:

  • ko.toJSONJSON.stringify करने पर अपनी 2 और 3 तर्क गुजरता है: यहाँ कई तरीके है कि आप कैसे अपनी वस्तु JSON में बदल जाती है को नियंत्रित कर सकते हैं। दूसरा तर्क है कि आप here वर्णित मानों को संभावित रूप से प्रतिस्थापित करने के लिए एक फ़ंक्शन चलाते हैं। यहां एक नमूना है जो यह देखने के लिए जांचता है कि कुंजी एक संख्या है (सरणी आइटम) और इसमें value संपत्ति है। यदि ऐसा है, तो यह ऑब्जेक्ट की बजाय स्ट्रिंग देता है। http://jsfiddle.net/rniemeyer/N3JaW/1/

  • आप अपनी वस्तुओं के लिए एक निर्माता समारोह का उपयोग करते हैं, तो आप toJSON समारोह के रूप में वर्णित here ओवरराइड कर सकते हैं। इस कार्यक्षमता के साथ आपका नमूना यहां दिया गया है: http://jsfiddle.net/rniemeyer/N3JaW/2/

  • एक और तकनीक जिसका उपयोग किया जा सकता है वह एक गणना करने योग्य अवलोकन योग्य है जिसे "अच्छा" मान है। यहां नमूना है: http://jsfiddle.net/rniemeyer/N3JaW/3/। इस में Items एक गणना योग्य अवलोकन योग्य है जो स्वच्छ मूल्य देता है। Items.asObjects में आपके मूल्यों का ऑब्जेक्ट संस्करण शामिल है। जब JSON में परिवर्तित किया जाता है, asObjects भाग स्वाभाविक रूप से गिरा दिया जाता है जब Items JSON में परिवर्तित हो जाता है।यदि आपको JSON में कनवर्ट करते समय केवल "अच्छी" सरणी की आवश्यकता होती है, तो अन्य विकल्प प्रदर्शन के लिए बेहतर होते हैं (वे केवल तभी गणना की जाती हैं जब आप इसे भेजना चाहते हैं)।

+0

मुझे वास्तव में jsfiddle पर आपका दृष्टिकोण पसंद है, लेकिन मैंने यह उल्लेख नहीं किया कि मुझे इस मॉडल को सर्वर पर वापस पोस्ट करने की आवश्यकता होगी। इसका मतलब है कि 'आइटम' को एक स्ट्रिंग होना चाहिए []। तो मैं अनुमान लगा रहा हूं कि इसका मतलब है कि मुझे $ इंडेक्स रूट जाना चाहिए, सही? –

+0

जरूरी नहीं है। यह सुनिश्चित करने के कई तरीके हैं कि जेएसओएन आउटपुट उस राज्य में वापस आ जाए जो आप चाहते हैं। मैं जवाब के लिए कुछ जानकारी होगी। –

+0

अगर मैं कर सकता तो मैं आपको दो अप्स दूंगा। बहुत उपयोगी जवाब। –

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