8

バックボーン js の View.remove() 関数は、ビュー自体のコンテナー要素を DOM から削除し、削除されたビューの再作成を防ぎます。このシナリオがどのように処理されるかについての考え

ここに私のコードがあります、

var AttributeView = Backbone.View.extend({
        el: $("#attrs"),
        template:_.template($('#attrs-template').html()),

        initialize:function() {
        },


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

        dispose:function(eventName){
            this.unbind();
            this.remove();
        },

    });


var attrView = new AttributeView();
....
attrView.dispose();
//Later on some event I do the below
attrView = new AttributeView()
attrView.render();

上記の最後の 2 行は、id="attrs" を含む div が存在しないため、ビューを再作成しません。

4

2 に答える 2

21

まず第一に、disposeメソッドは必要ありません。標準removeで十分です。

var attrView = new AttributeView();
//....
attrView.remove();  // <--------- Do this instead
//...
attrView = new AttributeView()
attrView.render();

remove第二に、標準バージョンが必要なことを行わない場合はオーバーライドできます。デフォルトの実装では、いくつかのイベント リスナーを単純に削除this.elしてクリーンアップします。

remove: function() {
  this.$el.remove();
  this.stopListening();
  return this;
},

あなたの場合、実行するすべてを元に戻したいと考えています。つまり、内部renderの HTML をクリアし、次のように呼び出してイベントを削除します。 this.elundelegateEvents

remove: function() {
    this.undelegateEvents();
    this.$el.empty();
    this.stopListening();
    return this;
},

次に、それを呼び出しattrView.remove()て殺し、(new AttributeView()).render()元に戻すことができます。

デモ: http://jsfiddle.net/ambiguous/Pu9a2/3/

于 2012-06-10T05:21:40.673 に答える