2012-07-23 71 views
0

我想在我的Backbone.View中聽一個孩子的事件。我認爲這將是正確的做法,但我不確定。父項中的更新函數未被調用。謝謝您的幫助。聽Backbone.View中的兒童事件

text.js.coffee

class App.Views.Text extends Backbone.Views 

    initialize: -> 
    @_styleToolbar = App.Views.StyleToolbar el: $("#style_toolbar") 
    @_styleToolbar.on("update", @update()) 

    update: -> 
    # update text color, font etc 

style_toolbar.js.coffee

class App.Views.StyleToolbar extends Backbone.Views 
    'change .font_face select' : 'update' 

    update: (e) -> 
    $(@el).trigger('update', @el) 

這是代碼的簡化版本,所以讓我知道如果有什麼遺漏,我會更新它。

回答

1

這很好,主幹視​​圖有Backbone.Events混合的原因。

雖然你在代碼中有幾個問題。你需要解決的是觸發事件,你想觸發的視圖,而不是它的el;這樣的:

$(@el).trigger('update', @el) 

應該是:

@trigger('update', @) 

我也切換@el只是@讓聽者將有機會獲得全視圖對象,而不是它的el。如果你使用@update(),那麼你將調用@update和它的返回值綁定到"update"事件

@_styleToolbar.on("update", @update) 

而且,聽衆應該結合一個函數,而不是函數的返回值。你可能想用fat-arrow (=>)以及定義update

update: (toolbar) => 
    # update text color, font etc 

這會給你正確的@(AKA this)時update被調用。

+0

謝謝畝,我會嘗試現在。你會推薦這樣做嗎?還是應該互相忽略並通過模型/集合更新進行通信(因爲這些更改都存儲在數據庫中)?我經常看到一些解決方案,這些解決方案建議只是讓孩子成爲家長的一部分,但對我而言,這看起來並不太乾燥或OOP。 – botbot 2012-07-23 23:52:52

+1

@masterkrang:取決於(像往常一樣)。如果你想讓這些設置保持不變,那麼'Text'將會監聽的一個單獨的設置模型(對於「change」事件)和'StyleToolBar'將會調用'set'會有意義。如果你不想持久化,那麼可以使用一個簡單的'Backbone.Events'實例作爲一個簡單的pub-sub對象。對於簡單的事情來說,通過事件彼此交流意見是合理的,但當事情變得更加複雜時,準備轉向其他方法之一。 – 2012-07-24 00:00:09

+0

實現了這一點,似乎工作,再次感謝。將會在「事情變得更加複雜」時再回來。 :) – botbot 2012-07-24 00:09:55