16

コレクションに編成され、対応するビューやビューのコレクションに接続された多数のバックボーン モデルがあります。同じコレクションに属さないこれらのモデルの一部は、別のモデル (および複数のモデル) にとって重要なイベントをトリガーする必要があります。

これに対処するための推奨される方法は、ここや他の場所で説明されている「グローバル イベント ディスパッチャー/アグリゲーター」だと思います。

ただし、たまたまrequire.jsも使用しています。これは、ディスパッチャー/アグリゲーターをアプリケーションの名前空間オブジェクトにアタッチするという考えに反しているようです-または、ここで間違っていますか?

私の質問は次のとおりです。

4

2 に答える 2

35

@Andreas が提案したものと同様のソリューションですが、Backbone.Marionette はありません (それにもかかわらず、非常にインスピレーションを得ています。質問にリンクされている記事を参照してください)。

必要なのは、イベント リスナーのシングルトンを作成するモジュールを定義し、イベントをトリガーするか、このイベントをリッスンするモジュールでこのオブジェクトを要求することだけです。

チャネルを定義するapp/channel.jsがあるとします。

define(['backbone', 'underscore'], function (Backbone, _) {
    var channel = _.extend({}, Backbone.Events); 
    return channel;
});

その後、それをリスナーとして使用できます

require(['app/channel'], function (channel) {
    channel.on('app.event', function () {
        console.log('app.event');
    });
});

そして、あなたはこのチャンネルでイベントをトリガーすることができます

require(['app/channel'], function (channel) {
    channel.trigger('app.event');
});
于 2012-09-13T11:42:00.543 に答える
1

私たちapp.ventはマリオネット (私たちのアプリケーションのグローバル イベント トランスミッター) を require js と共に使用しており、非常にうまく機能します。

アプリ

define(, function(){
  return new Backbone.Marionette.Application();
})

モデル1

define(['app'], function(app){
  return Backbone.Marionette.Model.extend({
    initialize: function(){
      this.bindTo('app.vent', 'create:model2', this.toSomething, this);
    }
  })
})

モデル2

define(['app'], function(app){
  return Backbone.Marionette.Model.extend({
    initialize: function(){
      app.vent.trigger('create:model2', this);
    }
  })
})
于 2012-09-13T09:59:38.167 に答える