2012-12-29 14 views
24

私は1ページアプリケーションを作成しています。私はバックボーンが非常に新しくなっています。私は同じラッパーdivを使用する複数のビューを作成することに問題があります。バックボーン削除ビューでelを削除します

マイセットアップ:

私はすべてのビューに近い機能を追加しました:

Backbone.View.prototype.close = function(){ 
    this.remove(); 
    this.off(); 
    if (this.onClose){ 
     this.onClose(); 
    } 
} 

私は、ビューをレンダリングそれらを削除し、新しいものをレンダリングするラッパーのdivを持っています。だから私のSetupViewは次のようになります。私は閉じ意見を交換機能から

app.SetupView = Backbone.View.extend({ 
    el: '#my_view_wrapper', 
    ... 
}); 

このような電流(オープン)ビュー:私の問題があることである

var v = this.model.get('view'); 
v.close(); 

質問私は同じラッパーdivを使用して複数のビューを持っています。しかし、ビューを閉じると、このwrapper-divが削除されているように見えます。作成しようとする次のビューでは、このdivは見つかりません。

私は簡単な解決策があると思いますか?私は同じラッパーを再利用し、ラッパー自体ではなく、その内部のビューを削除するだけです。

+0

'remove'はDOMから要素を削除します。しかし、私は「エル」を誤解したと思う。私はそれがちょうど新しい要素が注入された場所だと思ったが、新しい要素の一部となることを学んだので、 'remove'を呼び出すと削除されます。 – swenedo

+3

一般的には、それぞれのビューに自分自身の 'el'を管理させるほうがよいでしょう。ビューは、' el'を作成して、それを行い、ビューが削除されたら削除します。呼び出し元は、呼び出し元が制御するコンテナ内にビューの 'el'を置きます。複数のビューにDOM要素を再利用しないと、多くの問題を回避できます。 –

+1

@muistooshort - 良いアドバイス。これについて考えたことはありません。完璧な意味合いがあります。ありがとうございました。 – cheshireoctopus

答えて

17

シナリオでは、既存のDOM要素を「el」値として使用しないでください。バックボーンが要素を作成します。ビューをインスタンス化するときは、既存のラップ要素にアタッチするために次の操作を実行できます。ただ、(後で参照するために)加えとして

$(viewName.render().el).appendTo('#my_view_wrapper'); 
+0

ありがとう、これは私の問題を解決! – swenedo

25

:別のオプションは、それを除去するのではなく、$elを空にするようにサブビューremoveを上書きすることです。例えば。

remove: function() { 
     this.$el.empty().off(); /* off to unbind the events */ 
     this.stopListening(); 
     return this; 
} 

実際には使用していないラッパー要素を挿入する必要がないため、私はこれを好みます。

+1

私は同意します。このメソッドはBackboneに組み込まれ、 'el'が宣言されているかどうかに基づいて' empty'と 'remove'を切り替える必要があります。 –

+6

私は 'this。$ el.empty()。off()'も追加して、すべてのイベントがオフになっていることを確認します。 –

+1

参考までに、Backboneの実装は[こちら](http://backbonejs.org/docs/backbone.html#section-158)です。 –

関連する問題