ব্যাকবোন.জেএস-এ কোনও দৃশ্য ধ্বংস বা সরিয়ে ফেলুন


83

আমি বর্তমানে দর্শনগুলির জন্য একটি ধ্বংস / সরানোর পদ্ধতিটি বাস্তবায়নের চেষ্টা করছি তবে আমার সমস্ত দর্শনগুলির জন্য কাজ করার জন্য আমি জেনেরিক সমাধান পেতে পারি না।

আমি আশা করছিলাম যে কন্ট্রোলারের সাথে সংযুক্ত করার জন্য কোনও অনুষ্ঠান হবে, যাতে কোনও নতুন অনুরোধ যখন আসে তখন পূর্ববর্তী দর্শনগুলি ধ্বংস করে তারপরে নতুনগুলি লোড করে।

প্রতিটি দেখার জন্য একটি অপসারণ ফাংশন তৈরি না করে এটি করার কোনও উপায় আছে কি?


আপনার দৃষ্টিভঙ্গি ইকো-সিস্টেমটি কি উদাহরণ দেয়? আপনার প্রশ্নটি আমাকে ভাবতে বাধ্য করে যে পৃষ্ঠায় একবারে অনেকগুলি ভিউ রয়েছে। আপনি যা করার চেষ্টা করছেন তা আমি পুরোপুরি ভিজ্যুয়ালাইজ করতে পারি না এবং এইভাবে কোনও উত্তর দিতে পারে না যা আপনার প্রয়োজন হতে পারে।
বিল আইজেনহাউয়ার

4
এই দুর্দান্ত পোস্টগুলি থেকে অন্য কিছু নিদর্শন: লসটেচিইজ / এডারিকবাইলি
১৫

উত্তর:


47

সমস্ত তথ্য না জেনে ... আপনি নিজের মডেল বা নিয়ামককে একটি রিসেট ট্রিগার বেঁধে রাখতে পারেন:

this.bind("reset", this.updateView);

এবং আপনি যখন ভিউগুলি পুনরায় সেট করতে চান তখন একটি রিসেট ট্রিগার করুন।

আপনার কলব্যাকের জন্য, এমন কিছু করুন:

updateView: function() {
  view.remove();
  view.render();
};

4
আমি এটা ঠিক মনে করি না। ভিউ'র অপসারণ কার্যটি DOM থেকে সেই ভিউটির উপাদানটি সরিয়ে ফেলবে ( এখানে দেখুন )। আমি মনে করি এই লোকটি সম্পূর্ণরূপে দর্শন বস্তুটি সরাতে চায়।
Nutritioustim

4
এটি.আরমোভ () জ্যাকুরির অপসারণ () কল করে, যা ডেটা এবং ইভেন্টগুলিও সরিয়ে দেয় ... তবুও আমি মনে করি আপনাকে অন্যান্য ইভেন্টগুলি থেকে যেমন কাস্টম ইভেন্টগুলি বা মডেলটিতে পরিবর্তনগুলি আনবাইন্ড করতে এই .undelegateEvents কল করতে হবে ..
খোলে

21
this.remove()কল this.stopListening()এবং this.$el.remove()। প্রথমটি ব্যবহার করে যুক্ত সমস্ত ইভেন্ট শ্রোতাদের সরান this.listenTo(...)। দ্বিতীয়টি jQuery ব্যবহার করে সমস্ত ইভেন্ট শ্রোতাদের যোগ করে। দু'জনের মধ্যেই আপনি ইভেন্ট শ্রোতাদের যুক্ত করার জন্য অন্য কোনও উপায় ব্যবহার না করে আপনার আচ্ছাদন হওয়া উচিত। সুতরাং এই উত্তরটি সঠিক এবং আমার কাছ থেকে +1 পেয়েছে।
চৌই

162

আমাকে অবশ্যই নিশ্চিত হতে হয়েছিল যে ভিউটি কেবল ডিওএম থেকে সরানো হয়নি তবে ইভেন্টগুলি থেকে সম্পূর্ণ আনবাউন্ডও নয়।

destroy_view: function() {

    // COMPLETELY UNBIND THE VIEW
    this.undelegateEvents();

    this.$el.removeData().unbind(); 

    // Remove view from DOM
    this.remove();  
    Backbone.View.prototype.remove.call(this);

}

আমার কাছে ওভারকিলের মতো মনে হয়েছিল, তবে অন্যান্য পদ্ধতিগুলি কৌশলটি সম্পূর্ণরূপে করেনি।


10
আমি যা দেখেছি তার জন্য, এই.রেভ () কে jQuery এর অপসারণ বলা উচিত, যা DOM থেকে উপাদানটি সরিয়ে ফেলতে পারে তবে এর সাথে যুক্ত ডেটা এবং ইভেন্টগুলিও সরিয়ে ফেলা উচিত। সুতরাং আমি অনুমান করি যে কলগুলি undelegateEvents এবং অপসারণের ডেটা প্রয়োজনীয় হওয়া উচিত নয় ... আমি ঠিক আছি?
খোলা

4
@ ওপেনসাস ইভেন্টগুলি ডিওএম থেকে উপাদান অপসারণ করা সত্ত্বেও এটি শেষ করে চলেছে) this.undelegateEvents () এর সমস্ত ইভেন্ট আনবাইন্ড করার জন্য প্রয়োজন ছিল। আমি যেমন বলেছিলাম, এটি ওভারকিলের মতো অনুভূত হয়েছিল, তবে এটি কৌশলটি করেছে।
sdailey

4
আমি এটা পছন্দ করি. ইভেন্ট this.$elপরিবর্তে আপনার ব্যবহার করা উচিত $(this.el);)
mreq

4
আমার সমস্যার উত্তম উত্তরের জন্য +1, আপনার প্রথম উত্তর লেখার জন্য +1 :)
1nfiniti

4
আমার দৃষ্টিভঙ্গি এটি ধ্বংস এবং পুনরায় তৈরি করার ক্ষেত্রে পুনরায় রেন্ডার হচ্ছে না। এটা কি কারণে this.remove()?
রাইসা

20

আমি জানি আমি পার্টিতে দেরি করেছি, তবে আশা করি এটি অন্য কারও পক্ষে কার্যকর হবে। আপনি ব্যবহার করে থাকেন মেরুদন্ড v0.9.9 + আপনি ব্যবহার করতে পারে, listenToএবংstopListening

initialize: function () {
    this.listenTo(this.model, 'change', this.render);
    this.listenTo(this.model, 'destroy', this.remove);
}

stopListeningদ্বারা স্বয়ংক্রিয়ভাবে বলা হয় remove। আপনি এখানে এবং এখানে আরও পড়তে পারেন


8

এই আমি ব্যবহার করে যাচ্ছি। কোনও সমস্যা দেখেনি।

destroy: function(){
  this.remove();
  this.unbind();
}

4

বর্তমান ব্যাকবোন ডকুমেন্টেশন অনুযায়ী ....

ভিউ.রেভ ()

ডিওএম থেকে একটি দর্শন এবং এর এল সরিয়ে দেয় এবং ভিউ শোনার মতো কোনও বাউন্ড ইভেন্ট মুছে ফেলার জন্য স্টপলাইটিংকে কল করে।



0

সমস্যা সমাধানের উপায় আপনি ব্যবহার করতে পারেন!

initialize:function(){
    this.trigger('remove-compnents-cart');
    var _this = this;
    Backbone.View.prototype.on('remove-compnents-cart',function(){
        //Backbone.View.prototype.remove;
        Backbone.View.prototype.off();
        _this.undelegateEvents();
    })
}

আর একটি উপায় a বিশ্বব্যাপী ভেরিয়েবল তৈরি করুন, এটির মতো:_global.routerList

initialize:function(){
    this.routerName = 'home';
    _global.routerList.push(this);
}
/*remove it in memory*/
for (var i=0;i<_global.routerList.length;i++){
    Backbone.View.prototype.remove.call(_global.routerList[i]);
}

প্রথম দৃষ্টিভঙ্গি আমার পক্ষে কাজ করেছিল, আমি দৃষ্টিভঙ্গি নিয়ে একই রকম সমস্যায় পড়েছিলাম এবং ঘটনাগুলি একাধিকবার গুলি ছড়িয়েছিল যখন আপনি ফর্মটি জমা দেওয়ার সময় প্রতিটি দৃশ্য পুনরায় তৈরি করা হচ্ছে
ওএনএইএক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.