проблемы с прослушиванием событий с магистралью

Я пытаюсь прослушать, когда функция «attachmentClicked» моего представления вызывается в другом объекте. Вот класс, который первоначально вызывает событие:

class AttachmentView extends AttachmentViewerView
    template: _.template($('#AttachmentViewTemplate').html())
    className: "attachmentView"
    # 
    # initialize ->
    # 
    initialize: ->
        console.log "AttachmentView initialized"
        @render()

    events: {
        'click'     : 'attachmentClicked'
        'dblclick'  : 'openAttachment'
    }

    # 
    # render ->
    # 
    render: ->
        @$el.html(@template(@model.toJSON()))
        $('div.attachmentViewerView').append(@el)
        # @bind 'event', method

    # 
    # attachmentClicked ->
    # 
    attachmentClicked: ->
        @$el.addClass('selectedAttachmentView')

этот объект вызывает attachmentClicked при щелчке, теперь в другом классе, который создал этот объект, я пытаюсь прослушать это событие. Вот этот класс

class AttachmentViewerView extends AttachmentAppController 

    template: _.template($('#AttachmentViewerTemplate').html())
    className: "attachmentViewerView"

    #
    # initialize ->
    # 
    initialize: (options) ->
        console.log "AttachmentViewer initialized"
        @office = options.office
        @ticket = options.ticket
        @attachmentViews = []

        @render()

    # 
    # render ->
    # 
    render: ->
        @$el.html(@template())
        # Append to fileViewer Div
        $('#attachmentViewerWindow').append(@el)
        @renderFiles()

    # 
    # bindEvents ->
    # 
    bindEvents: (view) ->
        @listenTo view, 'attachmentClicked', @attachmentClicked


    # 
    # renderFiles ->
    # 
    renderFiles: ->
        @attachments = new AttachmentCollection({@office, @ticket})
        @attachments.fetch({
            success: (collection) =>
                _.each collection.models, (model) =>
                    # Create the attachment views and bind events right away
                    @bindEvents new AttachmentView({model: model})
            })

    # 
    # attachmentClicked ->
    # 
    attachmentClicked: (attachment) ->
        console.log( @ )
        @$el.find('.selectedAttachmentView').removeClass('selectedAttachmentView') unless @selected == attachment
        @selected = attachment

так что происходит то, что когда этот класс создается, он в конечном итоге вызывает renderFiles, который извлекает файлы с сервера, затем создает представление для каждой возвращаемой модели и вызывает bindEvent с этим параметром.

Затем bindEvent пытается прослушать метод attachmentClicked этого вновь созданного элемента и связать его с функцией attachClicked этого класса. Однако это не работает. Я пробовал несколько способов и не уверен, в чем моя проблема. Мы будем очень признательны за руководство.


person Blaine Kasten    schedule 15.05.2013    source источник


Ответы (1)


Вы прослушиваете 'attachmentClicked' события на своем AttachmentView:

bindEvents: (view) ->
    @listenTo view, 'attachmentClicked', @attachmentClicked

но я не вижу ничего, что могло бы вызвать такое событие. Настройка некоторых обработчиков событий DOM в представлении, подобном этому:

events:
    'click'     : 'attachmentClicked'
    'dblclick'  : 'openAttachment'

просто означает, что щелчок вызовет вызов attachmentClicked, но не вызовет событие 'attachmentClicked' Backbone; если вы хотите это событие, вам придется инициировать его самостоятельно:

attachmentClicked: ->
    @$el.addClass('selectedAttachmentView')
    @trigger 'attachmentClicked'
person mu is too short    schedule 15.05.2013
comment
Горячий черт. Я не понимал, что события не создают магистральных событий. Я предполагал, что он будет обрабатывать событие DOM и создавать магистральное событие. Большое спасибо. Вот оно. - person Blaine Kasten; 15.05.2013