2013-01-22 52 views
0

它看起来像每当我打电话view.remove()它不仅能消除从DOM的观点,而且整个身体删除Backbone.js的观点不允许我添加另一种观点认为

我打电话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); 
    } 

由于不再有一个本体元件我无法添加另一个视图

铬调试器输出:

$('html') 

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

一旦view.remove()是跑屏幕变成白色和$不重新填充( '主体')HTML(this.currentView.render()EL)。

编辑:

我改变从EL每个视图:$( '体 ')到EL:' .mainContent' 和index.html文件中增加了一个。

在app.showView我添加了搜索Maincontent格,如果它已被删除。最好删除一个div,而不是整个身体。

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

SOLUTION:

我要重写我的看法remove方法。我不想删除整个EL,只是内容:Recreating a removed view in backbone js

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

而是一个答案编辑你的问题,你应该有这个问题的答案回答。如果你不这样做,那么这个问题就会一直存在于未答复的队列中,直到失效(30天后,我认为)。 – machineghost

回答

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);