undefined возвращается для объекта currentView в Backbone.Marionette

Я тестирую, как макет может прослушивать пользовательские события своих подвидов.

Я создал jsFiddle здесь, где у меня есть макет, 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 и после того, как я покажу представления элементов, тогда обработчик макета правильно обработает пользовательские события.

Спасибо за вашу помощь.


person ontk    schedule 10.12.2012    source источник


Ответы (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"

Вот разветвленный Fiddle, который показывает, как срабатывает custom:event.

person McGarnagle    schedule 11.12.2012
comment
Да, у меня это работало точно так же, и это правда, что в моем определении класса, когда onShow вызывается в макете, в регионе нет представлений. Теперь для меня это очевидно (раньше не было :)). Однако мне нужно место в классе Layout, где я мог бы привязываться к представлениям вместо того, чтобы вызывать этот фрагмент кода после добавления подпредставлений. Видишь, что я имею в виду? - person ontk; 12.12.2012