次のような同様の問題の解決法を実装しました。二回マリオネットからの定期的なtriggerMethod
を呼び出します
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))
}
が
:まず、私は右のMarionette.Viewプロトタイプに新しい方法を書いたことが意図されるようにイベント名で一度に処理すること、及び第二の一つはイベントをバブリングするように指定された特殊なビューによって容易に認識されます。
次に、バブルアップされるような特殊なビューおよびバブルアップイベントが必要です。他のビューに代わって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 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)
}
})
:
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
方法によって処理されます何か、実際にバブルアップを作ることです
BubblingLayout
のインスタンスにアクセスできるコード内の任意の場所からバブリングされたイベントを処理できます。
このレイアウトの子領域のビューからイベントを発生させるとうまくいかないようですか? – Jon
申し訳ありませんが、それは本当に少しの推測でした。クリックイベントは、DOM階層をレイアウトビューにバブルアップして、通常のイベントオブジェクトを使用してレイアウト内でキャッチする必要があります。 –
シンプルなhttp://jsfiddle.netの例をまとめることができますか? –