2011-07-13 22 views
7

में उचित रूप से हटा नहीं रहा है, मुझे एक मॉडल के अंदर किसी संग्रह में किसी आइटम को हटाने में कुछ समस्या आ रही है। जब मैं देखने यह वास्तव में संग्रह से सही मद को हटा उप मद में सब आइटम संग्रह से कोई आइटम दूर करने की कोशिशbackbone.js संग्रह आइटम को

enter image description here

असल: मूल रूप से मॉडल/संग्रह संरचना निम्नलिखित है। हालांकि जब मैं मुख्य मॉडल को जारी रखने के लिए आता हूं तो आइटम संग्रह में अभी भी प्रतीत होता है।
इस तरह अपने विचार संरचित कर रहे:

enter image description here

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

new App.Views.MainModelView({ 
    model : this.model, 
    el : $('#nodeID') 
}) 

फर्क सिर्फ इतना सब-आइटम मॉडल देखने के लिए, जहां, कारण देख सकते हैं और टेम्पलेट की उपयोगिता फिर से के निर्माण में है, मैं अभी भी मुख्य में पास मॉडल, हालांकि मैं आइटम संग्रह में आइटम में भी पास करता हूं जो cur है किराए पर संशोधित किया जा रहा है। कौन इस तरह दिखता है:

:

this.item = (this.options.item) ? this.options.item : this.model; 

उप आइटम संग्रह मैं क्या से एक उप आइटम निकालने के लिए:

new App.Views.ItemView({ 
    model : this.model, 
    item : this.selectedItem, 
    el : $('#nodeID') 
}); 

उप आइटम के दृष्टिकोण init विधि में मैं निम्न कार्य करें

removeSubItem : function(e) { 
    // get the id of the sub-item to be removed 
    var id = $(e.target).closest('tr').attr('data-id'); 
    if (!id) throw "Could not retrieve data id"; 
    // retrieve the sub-item from the collection 
    var subItem = this.item.subItems.get(id); 
    // remove the sub-item from the collection 
    this.item.subItems.remove(subItem); 
}, 

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

मुझे पता है कि यह एक काफी विशिष्ट समस्या है और मुझे यकीन नहीं है कि अगर मैंने यहां प्रदान की है तो समस्या के कारण को प्राप्त करना संभव है, अगर आपको कोई और जानकारी चाहिए तो कृपया मुझे बताएं।

अपने सभी मदद के लिए धन्यवाद,

विन्सेंट

========== संपादित ============

से कुछ जवाब देने के लिए नीचे दिए गए प्रश्नों में मुझे इस समस्या का सामना करना पड़ रहा है जिसमें मुझे इस समस्या का सामना करना पड़ रहा है:

यदि मैं सबइटम दृश्य में this.item.subItems संग्रह को लॉग इन करता हूं, तो हटाए जाने के बाद Subitem कहा जाता था, मैं देख सकता हूं कि SubItem का उदाहरण मॉडल सफलतापूर्वक हटा दिया गया है। इससे पहले कि मैं मुख्य मॉडल पर सहेजने की विधि को कॉल करता हूं, मैं कंसोल को toJSON फ़ंक्शन की वापसी लॉग करता हूं। इस बिंदु पर मुझे समस्या का सामना करना पड़ रहा है कि पहले हटाए गए उदाहरण संग्रह में 'बैक' है। मैं वायरसहार्क और Google क्रोम के डेवलपर कंसोल दोनों के साथ क्लाइंट और सर्वर के बीच यातायात की निगरानी कर रहा हूं और किसी भी मॉडल को रीफ्रेश करने के लिए सर्वर को कोई कॉल नहीं है।

सब आइटम एकत्र करने के लिए toJSON विधि इस प्रकार है:

toJSON : function() { 
    App.log(["SubItem::collection::toJSON", this], "info"); 
    var json = {}; 
    // make sure the key for each SubItem is the primary key 
    this.each(function(subItem) { 
    json[subItem.get('id')] = subItem.toJSON(); 
    }); 

    return json; 
} 
+0

कृपया हमें बताएं या दिखाएं कि आपका क्या मतलब है "जारी" और आप इसे कैसे करते हैं और आप इसे कैसे पुनः लोड करते हैं। – Julien

+0

जब मैं लगातार बने रहने के बारे में बात करता हूं, तो मेरा मतलब सर्वर पर मॉडल को सहेजना है, इस प्रकार मुख्य मॉडल पर सहेजने की विधि को कॉल करना। सहेजा जा रहा है देशी या overridden toJSON विधियों की एक श्रृंखला के माध्यम से किया जाता है। अधिक जानकारी के लिए कृपया संपादन देखें। – luxerama

उत्तर

2

Backbone.js समर्थन/मॉडल गैर है अस्तित्व में है, और वे कोई बचत समर्थन प्रदान नहीं करते हैं (http://documentcloud.github.com/backbone/#FAQ-nested देखें)। आपको उप-चयन के साथ किसी भी मॉडल पर जेसन को ओवरराइड करना होगा। मैंने इस परिदृश्य में दस लाख बार भाग लिया है। आप की तरह कुछ (coffeescript में) है, तो:) mainModel.save (क्रम में

class MainModel extends Backbone.Model 

    itemCollection: -> 
     @_itemCollection ?= new ItemCollection(@get('itemCollection')) 


class ItemCollection extends Backbone.Collection 

    model: ItemModel 


class ItemModel extends Backbone.Model 

    subCollection: -> 
     @_subCollection ?= new SubCollection(@get('subCollection')) 


class SubCollection extends Backbone.Collection 

    model: SubModel 


class SubModel extends Backbone.Model 


mainModel = new MainModel(json) 

फिर काम करने के लिए, आप, MainModel और ItemModel पर toJSON ओवरराइड करने के लिए की जरूरत है की तरह:

class MainModel extends Backbone.Model 

    itemCollection: -> 
     @_itemCollection ?= new ItemCollection(@get('itemCollection')) 

    toJSON: -> 
     return _.extend(@attributes, {itemCollection: @itemCollection().toJSON()}) 


class ItemModel extends Backbone.Model 

    subCollection: -> 
     @_subCollection ?= new SubCollection(@get('subCollection')) 

    toJSON: -> 
     return _.extend(@attributes, {subCollection: @subCollection().toJSON()}) 

मैंने लिखा कॉफ़ीस्क्रिप्ट में उदाहरण क्योंकि यह जावास्क्रिप्ट से कहीं अधिक संक्षिप्त है। अगर आपको इसकी समझ में मदद की ज़रूरत है, तो कृपया पूछें।

आशा है कि इससे मदद मिलती है!

--- नोट ---

तकनीकी तौर पर, coffeescript में, toJSON तरीकों बस हो सकता है:

toJSON: -> 
    _.extend @attributes, itemCollection: @itemCollection().toJSON() 

लेकिन मैं इसे जिस तरह से मैं गैर coffeescripters के लिए और अधिक समझ में आने के लिए क्या किया लिखा था ।

1

अपने पूरे कोड बेस को देख के बिना मुझे लगता है कि आप अपने संरचना थोड़ा गलत हो सकता है। आम तौर पर रीढ़ की हड्डी के साथ मैं कभी भी कभी भी पास नहीं करता हूं: एल तत्व सीधे दृश्य में। दृश्य अपने स्वयं के एल बनाने के लिए जिम्मेदार है। इसे प्रस्तुत करने के बाद मैं फिर डीओएम में नया view.el डालें।

var subView = new FooView({ model: fooModel }); 

mainView.$(".list").append(subView.el); 

उपरोक्त मामले में प्रत्येक सबव्यू के साथ रीढ़ की हड्डी वस्तु है। यदि आपको को सबव्यूव को हटाने की आवश्यकता है, तो आपको इसे खोजने के लिए चयनकर्ता क्वेरी करने की आवश्यकता नहीं है, आप ऑब्जेक्ट पर निकालें विधि पर कॉल करें और यह जानता है कि डोम से खुद को कैसे हटाया जाए।

या अधिक विशिष्ट subview खुद पर एक क्लिक घटना संभालती होने के लिए जो इसे तो नष्ट यह मॉडल संबद्ध है और उसके बाद ही हटाने को फोन करके संभाल कर सकते हैं

नेस्टेड संग्रह के लिए
संबंधित मुद्दे