そのため、Twitter で @julio_menedez および @marionettejs との有益なチャットにもかかわらず、私の問題を本当に解決する解決策を見つけることができませんでした。Polymerを使用することは非常に良いアイデアでしたが、古い IE をサポートする必要があるため適切ではありませんでした。
その代わりに、私はそれを解決するためにモンキー パッチの危険な世界に向かいました (これはまだ書き終わったばかりで、完全にはテストされていないため、いくつかのしわを修正する必要があるかもしれないことを覚えておいてください。それに応じて更新します)
Coffeescript の場合: (一番下の JavaScript バージョン)
# Monkey patching the Marionette View.. sorry!
# this is the only Marionette view which doesn't have it's own constructor
Marionette.ItemView = Marionette.ItemView.extend
constructor: ->
Marionette.View.prototype.constructor.apply @, Array.prototype.slice.call(arguments, 0)
original_view_constructor = Marionette.View.prototype.constructor
Marionette.View.EventAggregator = event_aggregator = _.extend {}, Backbone.Events
# all the other constructors call this so we can hijack it
Marionette.View.prototype.constructor = ->
event_aggregator.listenTo @, 'all', =>
args_array = Array.prototype.slice.call arguments, 0
event_aggregator.trigger.apply event_aggregator, [ 'view:' + args_array[0], @ ].concat(args_array.slice(1))
event_aggregator.stopListening @ if args_array[0] == 'close'
original_view_constructor.apply @, Array.prototype.slice.call(arguments, 0)
次に、必要なビュー イベントをキャッチするために、アプリケーション オブジェクトにリスナーを設定するだけです。例えば:
@listenTo Marionette.View.EventAggregator, 'view:dom:refresh', (view) ->
view.$('div').css('backgroundColor', 'red');
したがって、私の見解では、これらはこの手法の長所と短所です。
長所:
- すべてのビュー クラスを注入したり、すべてのビュー クラスをサブクラス化したりすることなく、すべてのビュー イベントをリッスンできます。
- 使い方は簡単
- オブジェクトは、それを使用するためにオプトインする必要はまったくありません
短所
- Marionette にとって危険なモンキー パッチを使用 API の変更
- Marionette 名前空間を使用するため、将来の Marionette 名前空間の衝突に対して脆弱です
- ビューのコンテキスト外でビューを処理する
- イベントアグリゲーターオブジェクトを持つことは、Backbone/Marionette (afaiw) の他の場所で見られるものではないため、パターンを壊します (更新 - Backbone.history で同様のことが見られます)。
とにかく、フィードバック、代替案、批判を歓迎します:-)そして、これが同じ状況の他の誰かに役立つことを願っています
Javascript:
(function() {
var event_aggregator, original_view_constructor;
Marionette.ItemView = Marionette.ItemView.extend({
constructor: function() {
return Marionette.View.prototype.constructor.apply(this, Array.prototype.slice.call(arguments, 0));
}
});
original_view_constructor = Marionette.View.prototype.constructor;
Marionette.View.EventAggregator = event_aggregator = _.extend({}, Backbone.Events);
Marionette.View.prototype.constructor = function() {
var _this = this;
event_aggregator.listenTo(this, 'all', function() {
var args_array;
args_array = Array.prototype.slice.call(arguments, 0);
event_aggregator.trigger.apply(event_aggregator, ['view:' + args_array[0], _this].concat(args_array.slice(1)));
if (args_array[0] === 'close') {
return event_aggregator.stopListening(_this);
}
});
return original_view_constructor.apply(this, Array.prototype.slice.call(arguments, 0));
};
}).call(this);