दिलचस्प पोस्ट
कैसे ऐनम मूल्य के लिए कोशिश करो? कैसे अजगर कपड़े के साथ स्वचालित रूप से प्रेरित करने के लिए जवाब देना? नबल विदेशी कुंजी बुरा व्यवहार? जावा 8 लैम्ब्डा बनाम बेनामी क्लासेस सीएसवी फ़ाइल आयात। नेट में 64-बिट .NET अनुप्रयोग से WOW64 रजिस्ट्री कुंजी को कैसे खोलें एंड्रॉइड में एक एफएम रेडियो अनुप्रयोग कैसे बनाया जाए एक Windows बैच फ़ाइल से सिस्टम वातावरण चर सेट करना? ES6 WeakMap के वास्तविक उपयोग क्या हैं? AJAX प्रतिक्रिया के लिए jQuery AJAX मतदान, AJAX परिणाम या JSON सामग्री पर आधारित हैंडलिंग क्या आईफोन / एंड्रॉइड ब्राउज़र्स सीएसएस / मीडिया हाथ में हैं? उद्देश्य-सी में शून्य के लिए परीक्षण – यदि (एक्स! = शून्य) बनाम बनाम (एक्स) लाइन द्वारा स्ट्रिंग रेखा पढ़ें जावा का + =, – =, * =, / = यौगिक असाइनमेंट ऑपरेटर्स जब मैं session_start () कॉल करता हूं तो मैं अनुमति त्रुटि कैसे ठीक कर सकता हूँ?

बैकबोन.जेएस में दृश्य और मॉडल ऑब्जेक्ट्स का निपटान करना

मॉडल का निपटान करने का सबसे कारगर तरीका कौन सा है?

आमतौर पर, मैं नियंत्रक / राउटर में सभी तर्क रखता हूं। यह वही है जो निर्णय लेता है, किस दृश्यों को बनाया जाना चाहिए, और किस मॉडलों को उनसे आपूर्ति की जानी चाहिए। आम तौर पर, कुछ हैंडलर फ़ंक्शंस हैं, जो अलग-अलग उपयोगकर्ता कार्यों या मार्गों के अनुरूप हैं, जहां हर बार एक हेन्डलर निष्पादित होने पर मैं नया दृश्य उदाहरण बनाता हूं। बेशक, जो भी मैंने पहले दृश्य उदाहरण में संग्रहीत किया है उसे समाप्त करना चाहिए। हालांकि, कुछ परिस्थितियां हैं, जब कुछ विचारों को डोम ईवेंट हैंडलर स्वयं रखते हैं, और उन्हें ठीक से बाँट नहीं आती है, जिसके परिणामस्वरूप उन उदाहरणों को जीवित रखा जाता है। अगर इच्छा उदाहरणों को नष्ट करने का उचित तरीका होता है, तो उदाहरण के लिए, जब उनके एल (डोम प्रतिनिधित्व) अलग हो जाए या DOM से बाहर निकाल दिया जाए

Solutions Collecting From Web of "बैकबोन.जेएस में दृश्य और मॉडल ऑब्जेक्ट्स का निपटान करना"

आप सही रास्ते पर हैं आपके पास एक ऐसा ऑब्जेक्ट होना चाहिए जो आपके विचारों के जीवनचक्र को नियंत्रित करता है मुझे यह मेरे विचार में रखना पसंद नहीं है मैं इसके लिए एक अलग वस्तु बनाना चाहूंगा

आपको जो चीज करने की ज़रूरत है, वह तब आवश्यक है जब आवश्यक हो। ऐसा करने के लिए, अपने सभी विचारों पर एक "करीबी" पद्धति बनाने का एक अच्छा विचार है, और उस ऑब्जेक्ट का उपयोग करें जो हमेशा के करीबी तरीके से कॉल करने के लिए हर चीज़ के जीवनचक्र को नियंत्रित करता है।

उदाहरण के लिए:

function AppController(){ this.showView = function (view){ if (this.currentView){ this.currentView.close(); } this.currentView = view; this.currentView.render(); $("#someElement").html(this.currentView.el); } } 

इस बिंदु पर, आप केवल अपने AppController के एक उदाहरण के लिए अपना कोड सेट करेंगे, और आप अपने राउटर या किसी अन्य कोड से appController.showView(...) को हमेशा कॉल करेंगे, जिसमें #someElement भाग में एक दृश्य दिखाने की आवश्यकता होती है अपनी स्क्रीन की

(मेरे पास एक बहुत ही सरल बैकबोन ऐप का दूसरा उदाहरण है जो "ऐप वीव" (एक बैकबोन व्यू जो एप का मुख्य भाग चलाता है) का उपयोग करता है, यहां: http://jsfiddle.net/derickbailey/dHrXv/9/ )

close विधि डिफ़ॉल्ट रूप से विचारों पर मौजूद नहीं है, इसलिए आपको अपने प्रत्येक दृश्य के लिए खुद को बनाने की आवश्यकता है दो चीजें हैं जो हमेशा करीबी विधि में होनी चाहिए: this.unbind() और this.remove() इन के अलावा, अगर आप किसी भी मॉडल या संग्रह घटनाओं को अपने विचार बाध्य कर रहे हैं, तो आप उन्हें बंद विधि में खोलना चाहिए।

उदाहरण के लिए:

 MyView = Backbone.View.extend({ initialize: function(){ this.model.bind("change", this.modelChanged, this); }, modelChanged: function(){ // ... do stuff here }, close: function(){ this.remove(); this.unbind(); this.model.unbind("change", this.modelChanged); } }); 

यह DOM से सभी घटनाओं को ठीक से साफ़ कर this.remove() माध्यम से), सभी घटनाएं जो कि खुद ही देख सकते हैं (इस के माध्यम से। this.unbind() ) और उस घटना को मॉडल से बाध्य ( इस के माध्यम this.model.unbind(...) )।

बैकबोन.व्यूज़ ऑब्जेक्ट पर एक कस्टम बंद विधि जोड़ने के लिए एक सिंपलर तरीका है

 Backbone.View.prototype.close = function () { this.$el.empty(); this.unbind(); }; 

उपरोक्त कोड का प्रयोग करके आप निम्न कर सकते हैं

 var myView = new MyView(); myView.close(); 

बहुत आसान।

मैं हमेशा एन्यूके के विचारों को और कभी-कभी मॉडल पुनः उपयोग करता हूं सुनिश्चित करें कि विचारों को निरुपित किया जा सकता है एक दर्द हो सकता है, यदि आप मॉडल को चारों ओर रखना चाहते हैं मॉडल दृश्य के संदर्भ को रख सकते हैं यदि वे ठीक से अनबाउंड नहीं हैं

बैकबोन ~ 0.9.9 के अनुसार, model.on () के बजाय view.listenTo () के साथ बाध्यकारी मॉडल नियंत्रण के उलटाव (मॉडल के विरोध के रूप में विचार नियंत्रण बाइंडिंग) के माध्यम से आसान सफाई के लिए अनुमति देता है। यदि view.listenTo () को बाइंड करने के लिए उपयोग किया जाता है, तो देखने के लिए कॉल .स्टॉप लिस्टिंग () या view.remove () सभी बाइंडिंग को निकाल देगा। कॉलिंग मॉडल के समान। ओफ़ (रिक्त, रिक्त, यह)।

मैं नज़दीकी फ़ंक्शन के साथ दृश्य को बढ़ाकर विचारों को साफ करना चाहूंगा, जो उप-दृश्यों को अर्द्ध स्वचालित रूप से कॉल करता है उप-दृश्यों को माता-पिता के गुणों के द्वारा संदर्भित किया जाना चाहिए या उन्हें माता-पिता के भीतर एक सरणी में जोड़ा जाना चाहिए जिसे childViews [] कहते हैं।

यहाँ मैं बंद समारोह है कि मैं का उपयोग करें ..

 // fired by the router, signals the destruct event within top view and // recursively collapses all the sub-views that are stored as properties Backbone.View.prototype.close = function () { // calls views closing event handler first, if implemented (optional) if (this.closing) { this.closing(); // this for custom cleanup purposes } // first loop through childViews[] if defined, in collection views // populate an array property ie this.childViews[] = new ControlViews() if (this.childViews) { _.each(this.childViews, function (child) { child.close(); }); } // close all child views that are referenced by property, in model views // add a property for reference ie this.toolbar = new ToolbarView(); for (var prop in this) { if (this[prop] instanceof Backbone.View) { this[prop].close(); } } this.unbind(); this.remove(); // available in Backbone 0.9.9 + when using view.listenTo, // removes model and collection bindings // this.stopListening(); // its automatically called by remove() // remove any model bindings to this view // (pre Backbone 0.9.9 or if using model.on to bind events) // if (this.model) { // this.model.off(null, null, this); // } // remove and collection bindings to this view // (pre Backbone 0.9.9 or if using collection.on to bind events) // if (this.collection) { // this.collection.off(null, null, this); // } } 

इसके बाद एक दृश्य को घोषित किया जाता है ..

 views.TeamView = Backbone.View.extend({ initialize: function () { // instantiate this array to ensure sub-view destruction on close() this.childViews = []; this.listenTo(this.collection, "add", this.add); this.listenTo(this.collection, "reset", this.reset); // storing sub-view as a property will ensure destruction on close() this.editView = new views.EditView({ model: this.model.edits }); $('#edit', this.el).html(this.editView.render().el); }, add: function (member) { var memberView = new views.MemberView({ model: member }); this.childViews.push(memberView); // add child to array var item = memberView.render().el; this.$el.append(item); }, reset: function () { // manually purge child views upon reset _.each(this.childViews, function (child) { child.close(); }); this.childViews = []; }, // render is called externally and should handle case where collection // was already populated, as is the case if it is recycled render: function () { this.$el.empty(); _.each(this.collection.models, function (member) { this.add(member); }, this); return this; } // fired by a prototype extension closing: function () { // handle other unbinding needs, here } });