我为类似问题实施了一个解决方案,如下所示。首先,我写了一个新的方法对入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
(或所有的木偶事件)代表其他意见,因为这会导致区域和意见中的各种不可预知的行为。后缀: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例子放在一起吗? –