2013-07-11 2 views
3

Ok У меня есть макет, как в этой картинке:обработка между видами событий

Layout

В таблице в верхней части экрана, сделанный:

MessageListView

define(['backbone','collections/messages','views/message'], function(Backbone, MessageCollection, MessageView) { 
    var MessageListView = Backbone.View.extend({ 
     el: '#messagesContainer', 
     initialize: function() { 

      this.collection = new MessageCollection(); 
      this.collection.fetch({reset:true}); 
      this.listenTo(this.collection, 'reset', this.render); 

      this.table = this.$el.find("table tbody"); 
      this.render(); 
     }, 
     render: function() { 
      this.collection.each(function(message, index) {     
       this.renderMessage(message, index); 
      }, this); 
     }, 
     renderMessage: function(message, index) { 
      var view = new MessageView({ 
       model:message, 
       className: (index % 2 == 0) ? "even" : "odd"  
      }); 
      this.table.append(view.render().el); 
     } 
    }); 
    return MessageListView; 
}); 

MessageView

define(['backbone','models/message'], function(Backbone, MessageCollection, MessageView) { 
    var MessageView = Backbone.View.extend({ 
     template: _.template($("#messageTemplate").html()), 
     render: function() { 
      this.setElement(this.template(this.model.toJSON()));   
      return this; 
     }, 
     events:{ 
      'click':'select' 
     }, 
     select: function() { 
      // WHAT TO DO HERE? 
     } 
    }); 
    return MessageView; 
}); 

APPVIEW

define(['backbone','views/messages'], function(Backbone, MessageList) { 
    var App = Backbone.View.extend({ 
     initialize: function() { 
      new MessageList(); 
     } 
    }); 
    return App; 
}); 

Я скоро добавит новый вид (возможно "PreviewView") в нижней части экрана.

Я хочу что-то сделать внутри «PreviewView», когда пользователь нажимает на строку.

Например, может быть интересно отображать атрибуты другой модели (подробности, например) внутри PreviewView.

Какая практика?

  • с ссылкой на PreviewView внутри каждого MessageView?
  • запуск событий внутри метода выбора и прослушивание их с использованием on() внутри представления предварительного просмотра.
  • с использованием переходного атрибута «selected» в моей модели и заставить PreviewView прослушивать события «изменения» коллекции?

Спасибо, если вам нужно более подробно рассказать мне, пожалуйста, отредактировав вопрос.

ответ

6

Не уверен в лучшей практике, но я нашел это решение тривиальным для реализации. Я создал глобальный объект обмена сообщений, автобус, независимо:

window.App = {}; 
window.App.vent = _.extend({}, Backbone.Events); 

Вы должны зарегистрировать «отпираемую» функцию PreviewView на ранее созданную шине событий (по вашему примеру, это должно быть в PreviewView):

initialize: function() { 
    App.vent.on('PreviewView.show', this.show, this); 
} 

Теперь вы можете запускать любое зарегистрированное событие из любого места вашего приложения, позвонив по телефону: App.vent.trigger. Например, когда пользователь нажимает на строке, вы будете иметь что-то подобное:

App.vent.trigger('PreviewView.show'); 

в случае, если вы должны отправить и объект вместе с сработавшим использованием событий:

App.vent.trigger('PreviewView.show', data); 
+0

нормально, но как о прохождении его выбранная модель. Как PreviewView может узнать, какая модель в коллекции выбрана? Может быть, я могу передать на автобусе события сама модель? –

+0

уверен, триггер также принимает аргумент: App.vent.trigger ('PreviewView.show ', model); –

+0

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