Я реализовал решение для аналогичной проблемы следующим образом. Во-первых, я написал новый метод прямо в прототипе Marionette.View:
Marionette.View.prototype.bubbleMethod = function() {
var args = _.toArray(arguments)
var event = args.shift()
var bubble = event + ':bubble'
this.triggerMethod.apply(this, [ event ].concat(args))
this.triggerMethod.apply(this, [ bubble ].concat(args))
}
Это будет вызывать регулярные triggerMethod
из кукольного дважды: один раз с именем события, как оно предназначено быть обработаны, и второй, который легко узнаваемы специализированными представлениями, предназначенными для пузырьков событий.
Тогда вам понадобятся такие специализированные виды и события пузырей, которые должны быть пузырящимися. Вы должны быть осторожны, чтобы не отправлять события, такие как close
(или любые события Marionette вообще) в интересах других видов, потому что это вызовет всевозможные непредсказуемые поведения в регионах и представлениях. Суффикс :bubble
позволяет вам легко распознать, что означает пузырь.Вид пузыриться может выглядеть следующим образом:
var BubblingLayout = Marionette.Layout.extend({
handleBubbles: function (view) {
var bubble = /:bubble$/
this.listenTo(view, 'all', function() {
var args = _.toArray(arguments)
var event = args.shift()
if (event.match(bubble)) {
event = event.replace(bubble, '')
this.bubbleMethod.apply(this, [ event ].concat(args))
}
}, this)
}
})
Последнее, что вам нужно, чтобы убедиться, чтобы быть в состоянии пузырь событий в разных регионах (для макетов и модулей с менеджерами пользовательского региона). Это могут быть обработаны с show
отправок событий из региона, как это:
var BubblingLayout = Marionette.Layout.extend({
regions: {
sidebar: '#sidebar'
},
initialize: function() {
this.sidebar.on('show', this.handleBubbles, this)
},
handleBubbles: function (view) {
var bubble = /:bubble$/
this.listenTo(view, 'all', function() {
var args = _.toArray(arguments)
var event = args.shift()
if (event.match(bubble)) {
event = event.replace(bubble, '')
this.bubbleMethod.apply(this, [ event ].concat(args))
}
}, this)
}
})
Последняя часть, чтобы сделать что-то на самом деле пузыриться, который легко обрабатывается с помощью нового bubbleMethod
метода:
var MyView = Marionette.ItemView.extend({
events: {
'click': 'clickHandler'
},
clickHandler: function (ev) {
// do some stuff, then bubble something else
this.bubbleMethod('stuff:done')
}
})
var BubblingLayout = Marionette.Layout.extend({
regions: {
sidebar: '#sidebar'
},
initialize: function() {
this.sidebar.on('show', this.handleBubbles, this)
},
onRender: function() {
var view = new MyView()
this.sidebar.show(view)
},
handleBubbles: function (view) {
var bubble = /:bubble$/
this.listenTo(view, 'all', function() {
var args = _.toArray(arguments)
var event = args.shift()
if (event.match(bubble)) {
event = event.replace(bubble, '')
this.bubbleMethod.apply(this, [ event ].concat(args))
}
}, this)
}
})
Теперь вы можете обрабатывать пузырьковые события из любого места вашего кода, где вы можете получить доступ к экземпляру BubblingLayout
.
это похоже, не работает, если я поднимаю событие из представления в дочернем регионе макетов. – Jon
Извините, это было немного догадаться. Событие клика должно так или иначе вызывать иерархию DOM в вашем макете, чтобы вы могли поймать его в своем макете с помощью обычного объекта событий. –
Не могли бы вы собрать простой пример http://jsfiddle.net? –