2013-03-26 62 views
14

據我已經能夠告訴,listenTostopListening應分別代替onoff。我理解正確嗎?是否有一個地方on/off應該用來代替listenTo/stopListening任何情況呢?所有骨幹開/關事件是否應該用listenTo/stopListening代替?

編輯:

當我去重構我的代碼,很明顯,有一些情況下,對於on超過listenTo。該documentation是很清楚,它是當一個對象監聽到另一個對象:

告訴一個對象聽的其他對象的特定事件。

因此,當collectionmodel是聽取了他們對自身的事件,我們應該用on而不是listenTo

假設我有這個正確的...

的簡單的規則是這樣的:

使用listenTo監聽另一個對象的事件時。在聽自己的事件時使用on

+0

一些相關的討論在[這個問題](http://stackoverflow.com/questions/14041042/backbone-0-9-9-difference-between-listento-and-on) – explunit 2013-03-26 19:37:39

回答

10

在大多數情況下,你的理解是正確。這裏是從他們的github倉庫討論此事:https://github.com/documentcloud/backbone/issues/1923#issuecomment-11462852

listenTostopListening跟蹤狀態。它將以一些代碼開銷爲代價來照顧你。在幾乎所有情況下,我都會想到你會希望這種行爲適合你的觀點,但是你也不會因爲自己處理開/關電話而犯錯;他們不會貶低onoff不久。

+0

繼續使用'on '是,如果你想在事件處理程序被觸發時設置一個不同於'View'的上下文。 'listenTo'沒有上下文的說法,因爲它假定你想要的背景是'View'是在做聽音。 – machineghost 2015-01-08 03:51:35

14

複製從一個有趣的blog post,我最近讀的提取物。希望能幫助到你。

避免常見的陷阱骨幹:通過不解除綁定事件

在Backbone.js的一個常見的模式是創建在模型或集合變化聽取意見創建內存泄漏。此技術通常旨在允許視圖在底層數據更改時自動重新呈現自身。這也意味着對於大型集合,我們可能會得到許多視圖(對於集合中的每個模型至少有一個視圖),我們可能會根據數據更改動態創建或銷燬該視圖。

,就會出現問題,當我們刪除一個視圖(通常是通過調用一個.remove()方法),但忘記解綁在模型更改監聽的方法。在這種情況下,儘管我們的代碼可能不再持有對該視圖的引用,但它永遠不會被垃圾回收,因爲模型仍然通過事件處理程序持有這樣的引用。

持這種觀點,例如:

var SomeModelView = Backbone.View.extend({ 
    initialize: function() { 
    this.model.on('change', this.render, this); 
    }, 
    render: function() { 
    // render a template 
    } 
}); 

當調用一個.remove()方法,「變」的事件處理程序(我們的渲染功能)仍難免。所以雖然DOM元素可能被移除,但視圖對象本身永遠不會從內存中釋放。

解決這個容易(尤其是骨幹0.9.x版本) - 所有我們需要做的是停止使用。對綁定的事件處理程序()。相反,我們可以使用新的.listenTo()方法,像這樣:

initialize: function() { 
    this.listenTo(this.model, 'change', this.render); 
} 

最大的區別就在這裏是在從模型到視圖責任的轉變。這意味着只要我們稱之爲一個.remove(),該視圖將自動解除綁定結合使用它的.listenTo()方法,本質上解決這個共同泄漏到的任何事件。

+2

爲什麼現在有一個'listenTo'很好的總結。 – Bart 2013-03-28 13:16:27

+0

大摘要:) – Andru 2013-07-22 10:17:12

+0

木偶骨幹庫,已建成的內存管理(殺殭屍的意見等),以防止這些類型的內存泄漏。 http://marionettejs.com/ – 2013-09-14 01:20:13