Ответ 1
Пусть начинается сверху: Backbone.wreqr - это плагин Backbone, который поставляется с Marionette. Он предоставляет три шаблона обмена сообщениями для слабосвязанных приложений.
Этот ответ содержит пример кода из документа Backbone.wreqr - кредит оригинальные авторы.
События
EventAggregator
объекты работают как Backbone.Events
- они позволяют передавать события с именами. vent
является просто общим именем переменной для объекта EventAggregator
:
var vent = new Backbone.Wreqr.EventAggregator();
vent.on("foo", function(){
console.log("foo event");
});
vent.trigger("foo");
Команды
Команды очень похожи на события. Разница семантическая - событие сообщает другим частям приложения, что что-то произошло. Команда сообщает другой части приложения что-то сделать.
var commands = new Backbone.Wreqr.Commands();
commands.setHandler("foo", function(){
console.log("the foo command was executed");
});
commands.execute("foo");
Request/Response
RequestResponse
объекты, которые часто ссылаются на переменную с именем reqres
, обеспечивают слабосвязанный способ для компонентов приложения запрашивать доступ к объектам:
var reqres = new Backbone.Wreqr.RequestResponse();
reqres.setHandler("foo", function(){
return "foo requested. this is the response";
});
var result = reqres.request("foo");
console.log(result);
Радио и каналы
В качестве удобства Wreqr предоставляет объект с именем radio
, который смешивается в трех шаблонах обмена сообщениями. Команды, события и запросы могут быть сгруппированы в логические каналы для предотвращения помех. Например, вам могут потребоваться различные команды save
для каналов user
и document
.
В марионетке
Marionette.Application
создает экземпляры Commands
, RequestResponse
и EventAggregator
внутри канала ("global" by default)
, используя обычные имена переменных). Если вам нужно настраивать поведение, вы можете переопределить vent
, Commands
и reqres
.
_initChannel: function() {
this.channelName = _.result(this, 'channelName') || 'global';
this.channel = _.result(this, 'channel') || Backbone.Wreqr.radio.channel(this.channelName);
this.vent = _.result(this, 'vent') || this.channel.vent;
this.commands = _.result(this, 'commands') || this.channel.commands;
this.reqres = _.result(this, 'reqres') || this.channel.reqres;
},
Я предлагаю вам более подробно ознакомиться с Wreqr docs. Я также рекомендую прочитать через анонимный источник Marionette - он краткий и очень хорошо документирован и, по сути, включает источник Wreqr.
N.B. Следующий крупный выпуск Marionnette, v3.x, заменяет Wreqr Radio. Радио обеспечивает те же функции, что и Wreqr, с более чистым API. Можно использовать Radio в приложениях Marionette 2.x, которые я рекомендую, если вы начинаете новое приложение.