2012-04-18 12 views
19

मैं थ्रेडेड टिप्पणियों के संग्रह से निपट रहा हूं, और जब मैं एक टिप्पणी हटाता हूं जिसमें बच्चे हैं, तो मैं इस टिप्पणी के लिए model.destroy() करता हूं, और सर्वर की ओर से इसकी सभी शाखाएं हटा दी जाती हैं।बैकबोन जेएस: हटाने के लिए सिंक को कैसे अक्षम करें?

मैंने एक समारोह लिखा था कि एक बार पेड़ से नोड हटा दिया जाता है, सभी अनाथों को देखता है और उन्हें भी हटा देता है। तो जब मुझे अनाथ मिलते हैं, तो मैं उन पर model.destroy() चलाता हूं लेकिन क्योंकि वे सर्वर पर पहले ही हटा दिए गए हैं, सिंक रिटर्न त्रुटियों को सिंक करते हैं।

क्या कुछ destroy() कॉल के लिए सिंक अक्षम करने का कोई तरीका है?

+0

मैं उत्सुक हूं कि '.sync()' को ओवरराइड करना और 'हटाएं' विधि के लिए कुछ अतिरिक्त तर्क जोड़ना इसके लिए अधिक होगा, या यदि कोई क्लीनर तरीका है। –

+0

वैसे मुझे आशा है कि .sync() ओवरराइड न करें लेकिन मुझे ऐसा करने का कोई मूल तरीका नहीं दिख रहा है। मैं 'नष्ट' घटनाओं को ट्रिगर करके और संग्रह से मॉडल को विभाजित करके हैक कर सकता हूं लेकिन यह कोशेर नहीं लगता है। –

उत्तर

31

के बाद से सभी destroy विधि करता है एक हटाने का अनुरोध भेजने और destroy से चलाता है, बस destroy ट्रिगर है आप के लिए वास्तव में क्या देख रहे हैं।

model.trigger('destroy', model, model.collection, options); 

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

+0

धन्यवाद @ एडवर्ड। मैं उन्हें संग्रह से हटा रहा था। –

+8

'' model.collection.remove (मॉडल); '' 'काम करता है। – forresto

+4

@forresto - यह काम करता है अगर मॉडल केवल एक संग्रह में है। यदि आपके पास मॉडल कई संग्रह हैं, तो आपको यह जानना होगा कि मॉडल किस संग्रह में है और यह हर संग्रह में करता है - जिसका मतलब है कि उस मॉडल में ट्रैकिंग करना जो संग्रह से संबंधित है। वह पीछे की तरफ है। मॉडल पर 'नष्ट' को ट्रिगर करके, इसमें से कोई भी संग्रह इसे हटा देगा, और आपको ट्रैक करना होगा कि मॉडल में कौन से संग्रह हैं। –

2

यह बहुत देर हो चुकी है लेकिन एक ही समस्या वाले अन्य लोगों के लिए वैकल्पिक समाधान के रूप में काम कर सकती है।

एक समान समस्या के साथ सामना करते हुए, मैंने पर कॉल करने से पहले सभी बच्चों की आईडी null पर सेट कर दिया। इस तरह, रीढ़ की हड्डी सोचती है कि वे नए हैं और हटाए जाने पर सर्वर को DELETE HTTP अनुरोध नहीं बढ़ाते हैं।

deleteParent: function() { 
    this.model.children.each(function(child) { 
    // Set to null so that it doesn't try to spawn a 'DELETE' http request 
    // on 'destroy' since thinks its new (hack). 
    child.id = null; 
    child.destroy(); 
    }); 
    // This one DOES result in a 'DELETE' http request since it has an ID. 
    this.model.destroy(); 
}, 
+0

वैसे तो सर्वर से वास्तव में हटाने के बिना नष्ट करने का उद्देश्य क्या होगा? –

+0

यदि मैंने आपके प्रश्न को सही तरीके से समझा, तो जब आपने सर्वर से अभिभावक को हटा दिया, तो आपने अपने सभी बच्चों को भी हटा दिया (शायद लेनदेन पर), इसलिए जब आप यूआई से बच्चे अनाथों को हटा दें (* नष्ट *) जिन्हें आप नहीं चाहते हैं प्रत्येक या अनाथ को हटाने के लिए सर्वर को कॉल करने के लिए क्योंकि वे अब मौजूद नहीं हैं। यह वांछित व्यवहार प्राप्त करता है। – fcarriedo

1

इसी समस्या में भाग लें। fcarriedo के जवाब पर

// From the view 
this.model.collection.remove(this.model); 
+0

हालांकि यह संग्रह से मॉडल को हटा देता है, यह नष्ट घटना को ट्रिगर नहीं करेगा जिससे समस्याएं हो सकती हैं यदि आपके पास कोई ईवेंट सुन रहा है। –

1

निर्माण: के बाद से इस मुझे क्या करना कोड में बहुत स्पष्ट वास्तव में क्या चाहता था और था

कि संग्रह से मॉडल को दूर करने के अपने संग्रह से युक्त करने के लिए मॉडल के लिंक का उपयोग करते हुए मेरी पसंदीदा समाधान था , बस अपने मॉडल की घोषणा में नष्ट विधि ओवरराइड:

Models.YourModelName = Backbone.Model.extend({ 
    destroy: function() { 
     this.id = null; 
     Backbone.Model.prototype.destroy.apply(this, arguments); 
    } 
}); 
2

यह आपको नष्ट कॉल का सम्मान करने की अनुमति देता है किसी भी सफलता संचालकों

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