2016-02-20 2 views
1

Я использую Backbone с Coffeescript в приложении. Теперь пример, который я буду использовать, сделан настолько тривиально, насколько это возможно. У меня есть заголовок в моем приложении, и все его представления разделяют его. Этот заголовок имеет ссылку выхода с индексом #logout. Теперь то, что я пытаюсь сделать, - это установить метод событий и метод, которые событие будет использовать, когда оно запускается в объекте mixin и расширяет прототип моего Backbone View. Вот код:Использование метода Backbone.View событий через mixin

Mixin.Header = 
    events: -> 
    'click #logout': 'logout' 

    logout: (e)-> 
    e.preventDefault() 
    $.ajax(
     type: 'DELETE' 
     url: '/logout' 
    ).then(
     -> 
     document.location = '' 
    ) 

class View extends Backbone.View 
    initialize: (options)-> 
    _.extend(View.prototype, Mixin.Header) 

Я просматривал исходный код Backbone, и я просто не могу найти проблему, почему это не работает. События передаются в представление через метод delegateEvents(), и когда инициализируется представление, сначала вызывается метод инициализации.

ответ

2

fine manual От:

событияview.events или view.events()
[...]
Backbone автоматически присоединять обработчики событий во время создания экземпляра, прямо перед вызовом initialize.

Вы пытаетесь добавить события в initialize но события связаны перед темinitialize называется.

Вы могли бы назвать себя delegateEvents пересвязать события после того, как вы обновили прототип:

initialize: (options)-> 
    _.extend(View.prototype, Mixin.Header) 
    @delegateEvents() # <---------- 

но структура будет немного странно, потому что вы бы модифицировать класс внутри экземпляра.

Я думаю, вы бы лучше модифицировать класс, прежде чем какие-либо экземпляры:

class View extends Backbone.View 
_.extend(View.prototype, Mixin.Header) 

или вы можете использовать ярлык CoffeeScript для prototype:

class View extends Backbone.View 
_.extend(View::, Mixin.Header) 
# -----------^^ 

или даже:

class View extends Backbone.View 
    _.extend(@::, Mixin.Header) 

Вы по-прежнему сталкиваетесь с проблемами, если View имеет свой собственный events, так как _.extend слепо перезаписывает свойства, а не объединяет их. Вам нужно что-то умнее, чем _.extend, чтобы правильно обработать это, и ему нужно будет выяснить, как объединить функции и объекты events.

+0

спасибо. После публикации вопроса поздно вечером, утром (конечно), я нашел в документах, что представления событий привязаны, прежде чем создавать экземпляр этого представления, но вы даже дали работу для этого. –

Смежные вопросы