【问题标题】:undefined returned for currentView object in Backbone.Marionette为 Backbone.Marionette 中的 currentView 对象返回未定义
【发布时间】:2012-11-28 09:30:05
【问题描述】:

我正在测试布局如何监听其子视图的自定义事件。

我创建了一个 jsFiddle here,其中有一个布局、2 个区域,我实例化了 2 个 ItemView 并将它们显示在布局的区域中。小提琴在 CoffeeScript 中。

<div id="region"></div>
<script id="layout-tmpl" type="text/_">
    <h3>Heading</h3>
    <div id="content"></div>
    <div id="content2"></div>    
</script>

<script id="item-tmpl" type="text/_">
    <form>
        <label>Firstname:</lable>
        <input type="text" name="firstname" value="<%= firstname %>" />
        <input type="button" value="Save" id="save" />
    </form>    
</script>

CoffeeScript 是:

SimpleLayout = Backbone.Marionette.Layout.extend 
    template: '#layout-tmpl' 
    regions:
        main: '#content'
        other: '#content2'
    initialize: () ->
        console.log @
    onShow: () ->
        _.each @.regionManagers, (region, name, something) =>
            console.log region.currentView
            # @.bindTo region.currentView, "custom:event", @callback           
    callback: () ->
        alert "HELL YEAH"

SimpleItemView = Backbone.Marionette.ItemView.extend
    template: "#item-tmpl"
    events:
        'click #save': 'save'
    save: (evt) ->             
        evt.preventDefault()
        @.trigger "custom:event"

region = new Backbone.Marionette.Region el: "#region"    
layout = new SimpleLayout() 
region.show layout
layout.main.show new SimpleItemView model: (new Backbone.Model firstname: "Olivier")
layout.other.show new SimpleItemView model: (new Backbone.Model firstname: "Travis")        

我希望布局能够监听 ItemViews 的自定义事件。在 onShow 中,我正在遍历区域管理器并尝试访问 currentView 对象,但它返回 undefined。

如果我在 SimpleLayout 类之外附加相同的事件处理程序,并且在显示项目视图之后,布局处理程序会正确处理自定义事件。

感谢您的帮助。

【问题讨论】:

    标签: backbone.js coffeescript marionette


    【解决方案1】:

    我认为发生的情况是,当布局的 onShow 被调用时,视图实际上还没有准备好:

    layout = new SimpleLayout() 
    
    region.show layout 
    

        // onShow 在这里调用,没有要绑定的视图,因为它们还没有被创建

    layout.main.show new SimpleItemView model: (new Backbone.Model firstname: "Olivier")
    layout.other.show new SimpleItemView model: (new Backbone.Model firstname: "Travis") 
    
    // now the views are ready, they can be bound to
    _.each layout.regionManagers, (region, name) =>
        console.log region.currentView
        region.currentView.bindTo region.currentView, "custom:event", () ->
            alert "HELL YEAH"
    

    Here's a forked Fiddle 显示 custom:event 被触发。

    【讨论】:

    • 是的,我让它的工作方式完全相同,而且在我的类定义中,当在布局上调用 onShow 时,该区域中没有视图。现在对我来说很明显(以前不是:))。但是,我希望在 Layout 类中有一个可以绑定到视图的位置,而不是在添加子视图后调用这段代码。明白我的意思了吗?
    猜你喜欢
    • 2017-07-11
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多