2012-01-31 57 views
5

我正在開發一個backbone.js應用程序,並且已經達到了我有許多路由器和視圖代表我的應用程序的每個部分的地步。在下面的簡化路由器示例中,我有兩個位置; account & users用backbone.js清理視圖?

在每個位置的兩個視圖都將其內容呈現爲一個相互元素,名爲#appcontainer。我的常識說,我應該確保remove每個視圖啓動之前,以防止綁定,DOM和什麼的衝突。

但是因爲我無法確定是否已經創建了一個視圖,所以我無法從路由器或視圖中明確地調用previousView.remove()

$(this.el).empty()添加到每個視圖的構造函數中是否足以清除DOM中任何最終的綁定和元素?

這是路由器的例子嗎?

var myRouter = Backbone.Router.extend({ 

    routes: { 
     "account": "account", 
     "users": "users" 
    }, 

    account: function() { 
     view = new AccountView({}); 
     view.render(); 
    }, 

    users: function() { 
     view = new UserView({}); 
     view.render(); 
    } 

}); 

回答

11

我有一個非常簡單的實現,我纔剛剛開始我的應用程序,不知道這是怎麼回事托起,從長遠來看,但它看起來是這樣的:

編輯:這是整個文件的樣子。 this.render將是myRouter的另一個功能。

var myRouter = Backbone.Router.extend({ 
    routes: { 
     'path/to/account' : 'account', 
     'path/to/users': 'users' 
    } 

    account: function() { 
     view = new AccountView({}); 
     this.render(view); 
    }, 

    users: function() { 
     view = new UserView({}); 
     this.render(view); 
    }, 

    render: function (view) { 
     //Close the current view 
     if (this.currentView) { 
      this.currentView.remove(); 
     } 

     //render the new view 
     view.render(); 

     //Set the current view 
     this.currentView = view; 

     return this; 
    } 
}); 
+0

嗨!感謝您的回答。運行jQuery的'.remove()' - 方法將它自己與主體''.remove()'在視圖中分開嗎? – Industrial 2012-02-06 10:59:21

+2

Backbone的.remove()只是jquery的.remove()的別名,所以出於這些目的他們是平等的。 – MrGrigg 2012-02-07 17:02:14

+1

@MrGrigg **你能否澄清一下渲染方法會去哪裏?它看起來像它進入路由器本身,但我想確保... ** _我真的很喜歡這個代碼的外觀,乍一看,它似乎是一個很好的方式來構建一個application_。 – Emerson 2012-04-07 20:41:38