2012-07-23 116 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