2012-02-11 48 views
1

回收視圖我工作在一個骨幹應用程序,它利用了很多的觀點。我陷入了實例化一個路由器(通常是我認爲的)的陷阱,它負責清理視圖,實例化新的視圖,並填充數據。我說陷阱,因爲儘管JavaScript有一個內置的垃圾回收器,但是人們很快就會開始注意到應用程序的可用性如何受到仍然駐留在內存中的許多未使用的視圖的阻礙。在Backbone.JS

我希望有一種方法可以回收這些視圖。我認爲這將和使用新模型在視圖上調用initialize()一樣簡單,然後重新渲染。這不幸並不容易。

而且,一個人必須要有點「消滅」視圖處理,例如,事件處理程序和東西...

這將是一個很好的做法,這樣做呢?

回答

3

DOM中刪除視圖後,它將被垃圾收集。除非你緩存它。如果您確實緩存了一個視圖並將其從DOM中刪除,則所有事件處理程序也都會被垃圾收集。除非你使用jQuery的detach方法,它將保留事件處理程序。

http://api.jquery.com/detach/

如果要回收的視圖,只是它緩存在一個變量。

裏面你router的init方法,做這樣的事情:

this.views = {}; 

然後當路由被稱爲檢查,如果該視圖的名稱是在緩存中可用,如果是,使用,否則創建一個新的。

someRoute: function() { 
    var view; 
    if (_.has(this.views, 'someRouteView')) { 
     view = this.views.someRouteView; 
    } else { 
     view = new SomeRouteView; 
     this.views.someRouteView = view; 
    } 
    // You have a view now 
} 

同樣,如果你不創建一個新的視圖,你將不得不使用像jQuery的detach方法來保存事件處理。

+0

什麼初始化?我應該專門調用一個自定義的「構造函數」函數來重新初始化它嗎?只是調用「初始化」不會完成這項工作 – preslavrachev 2012-02-11 13:44:15

+0

你絕不會直接在骨幹中的視圖上調用'initialize'。除非你在另一個視圖的'initialize'方法中模擬繼承。該視圖在被緩存時已經被初始化。調用'new View'運行init方法。 – Trevor 2012-02-11 14:21:02

+0

使用緩存視圖的唯一真正好處是性能。每次運行路線時,您都不必重新渲染視圖。 – Trevor 2012-02-11 14:50:34