0

view.remove() を呼び出すたびに、dom からビューを削除するだけでなく、ボディ全体も削除するように見えます

各ビューの作成後に showView を呼び出しています

showView : function(view) {
        if (this.currentView) {
            this.currentView.remove();
            this.currentView.unbind();
            if (this.currentView.onClose) {
                this.currentView.onClose();
            }
        }

        this.currentView = view;

        $('body').html(this.currentView.render().el);
  }

body 要素がなくなったため、別のビューを追加できません

Chrome デバッガー出力:

$('html')

<html>​
<script id=​"tinyhippos-injected">​…​&lt;/script>​
<head>​…​&lt;/head>​
</html>​

view.remove() が実行されると、画面が白くなり、 $('body').html(this.currentView.render().el); に再入力されません。

編集:

各ビューを el: $('.body') から el: '.mainContent' に変更し、index.html ファイルに a を追加しました。

app.showView で、mainContent div が削除されている場合は追加します。ボディ全体よりも div を削除することをお勧めします。

if($('.mainContent').length == 0)
    $('body').append('<div class="mainContent"></div>');

解決:

ビューの削除メソッドをオーバーライドする必要がありました。el 全体を削除したくはありませんでした。コンテンツだけを削除したかったのです:バックボーン js で削除されたビューを再作成する

Backbone.View.prototype.remove = function() {
    this.undelegateEvents();
    this.$el.empty();
    return this;
    };
4

1 に答える 1

2

経由でビューを追加しているため、ビュー$('body').html(this.currentView.render().el);に el プロパティを設定する必要はありません。

ビューで el プロパティを設定すると、バックボーンにその要素を見つけて基本要素として使用するように指示します。その場合、 を使用してページに追加する必要はなく、 を$('body').html()呼び出すだけで済みますview.render()。ただし、remove() を呼び出すと、設定した el (この場合は「body」または「.mainContent」) が削除されます。

el を指定しない場合、新しい要素が生成されます。その場合、 を使用してページに追加する必要がありますが$('body').html(this.currentView.render().el);、呼び出すremove()と、生成された要素のみが削除されます。

したがって、el: '.mainContent'ビューから削除するだけで、その要素を確認して再度追加する必要がなくなります。また、削除をオーバーライドする必要はありません。

ビューから削除el: '.mainContent'した後、次のように簡単に実行できます。

$('body').html(view1.render().el);
view1.remove();
$('body').html(view2.render().el);
于 2013-01-23T19:02:37.433 に答える