2016-05-24 21 views
0

ブラウザの戻るボタンをクリックしたときに重複を引き起こさないようにイベントを削除する方法を教えてください。または、ビューを再度初期化するときに、イベントを元に戻す方法はありません。本当にそれに対処する方法を突きつけた。 ボタンを押してからもう一度押すと、複数の発火イベントが発生します。モデルフォームデータを保存する場合など。ありがとうございました。ブラウザの戻るボタンが押されたときのビューイベントの削除解除

var App = {}; 

// extending models, collections etc. 

App.SamplesCollectionView = Backbone.View.extend({ 

    el: '#samples', 
    template: _.template($('#sample-edit-template').html()), 
    events: { 
     'click a.sample-item': 'onEdit' 
    }, 
    render: function(){ 
     this.$el.append(this.template()); 
     var $sample_list = this.$el.find('ul#sample-list'); 
     this.collection.each(function(sample) { 
      var rendered = new App.CategoryView({model: sample}).render().el; 
      $sample_list.append(rendered); 
     }); 
    }, 

    onEdit: function(e) { 
     this.undelegateEvents(); 
     // go to edit view 
     Backbone.history.navigate(e.target.getAttribute('href'), {trigger: true}); 
     return false; 
    } 

}); 

App.SampleEditView = Backbone.View.extend({ 

    el: '#samples', 
    template: _.template($('#sample-edit-template').html()), 
    events: { 
     'click button.save': 'onSave', 
     'click button.cancel': 'onCancel', 
    }, 

    render: function() { 
     this.$el.append(this.template(this.model.toJSON())); 
     return this; 
    }, 

    onSave: function() { 
     this.undelegateEvents(); 
     var data = Helpers.getFormData(this.$el.find('form')); 
     this.model.save(data); 
     // go back to index view 
     Backbone.history.navigate('/samples', {trigger: true}); 
     return false; 
    } 

}); 

App.SamplesRouter = Backbone.Router.extend({ 
    routes: { 
     'samples': 'index', 
     'samples/edit/:id': 'edit' 
    }, 

    index: function() { 
     App.samples = new App.SamplesCollection; 
     App.samplessView = new App.SamplesCollectionView({collection: App.samples}); 
    }, 

    edit: function(id) { 
     App.sampleEdit = new App.SampleEdit({id: id}); 
     App.sampleEditView = new App.SampleEditView({model: App.sampleEdit}) 
    } 

}); 

App.samplesRouter = new App.SamplesRouter; 

Backbone.history.start({pushState: true, hashChange: false}); 
+1

おそらくゾンビの意見があります。これを再現する最小限のコードを共有する必要があります。もう一度ビューを初期化するときにイベントを元に戻す必要はありません(それは間違ったアプローチであり、可能であれば疑問です)、ビューを削除する前にすべてのリスナーを確実に削除する必要があります。 –

+0

サンプルコードを追加しました。私は間違っていることを知っています。あなたはそれを明確にしてください。あなたの答えをありがとう。 – Paule

+0

あなたのビューをDOMに追加するコードはありません...?それでは、これはどのように機能しますか?既存のビューを削除しないと、別のルートに移動するときにテンプレートが削除されます。 –

答えて

1

同じ要素#samplesを指すビューが多数あるという問題があります。 view.remove()に電話すると、他のビューの要素がなくなるため、1つのビューを削除することはできません。
DOMにその要素が存在する限り、共有要素にはビューインスタンスを参照するイベントハンドラがあるため、削除すると思われるビューはメモリ内に存在します。

表示機能を委譲して同じ要素の機能を編集する場合は、新しいビューインスタンスを作成せずに表示/非表示のテクニックを使用して同じビューで行います。

それ以外の場合は、独自の要素を持つ必要があります。同じ要素を指す2つのビューインスタンスを持つことはできません。別のビューに切り替えるときは、remove()というメソッドを呼び出してDOMから要素を削除し、undelegateEventsを呼び出して、ガベージコレクションが正しく行われるようにしてください。

関連する問題