0

コレクションのbboneビューでのユーザーの操作によってトリガーされるカスタムイベントがあり、それが別の無関係なビューでの変更を通知するようにしたいと思います。このために、私はカスタムイベントを使用します。

//a global event object for my pub-sub model
var vent = Backbone.extend({}, Backbone.Event);

var C1 = Backbone.Collection.extend();
var V1 = Backbone.View.extend(
  events: {
    'click .appointment': 'clickCallback'
  },

  clickCallback: function(){
    vent.trigger('appointment:selected', apptProps);
  }
);

var c1Obj = new C1([{...}, {...}]);
var v1Obj = new V1({
  collection: c1Obj
});

したがって、ユーザーがコレクションビューv1Objの.appointment要素をクリックすると、appointment:selectedイベントがアナウンスされます。

ここで、別のビューV2がこのイベントに反応するようにします。「appointment:selected」イベントにバインドするのに最適な場所はどこですか?ビューV2のinitialize()(CASE 1)またはV2のコレクション/モデルのinitialize()(CASE 2)または他の場所で?もしあれば、ベストプラクティスを明確にしようとしています。

ケース1:

var V2 = Backbone.View.extend(
  initialize: function(){
    vent.on('appointment:selected', this.apptSelected, this);
  },
  appSelected: function(apptProps){
    ...
  }
);

ケース2:

var C2 = Backbone.Collection.extend(
  initialize: function(){
    vent.on('appointment:selected', this.apptSelected, this);
  },
  appSelected: function(apptProps){
    ...
  }
);

私が理解している限り、ユーザー操作時のBboneの哲学は、データを操作し、マークアップを変更しないことです。つまり、データの変更はビューにカスケードされます。もしそうなら、元の質問への答えはケース2ですか?

4

1 に答える 1

1

最も慣用的なことは次のようになると思います。

  • コレクションに含めることにより、「選択された」状態を表します
  • ユーザーがをクリックする.appointmentと、view1は選択されたAppointmentsコレクションに予定モデルを追加します
  • view2は、の通常のコレクションライフサイクルイベント(追加、削除、リセット)にバインドし、selectedAppointmentsそれに応じて自身を再レンダリングします
  • どちらのビューも、このコレクションをオプションの引数として使用します。initialize

Backbone 0.9.9以降では、Backboneオブジェクト自体を、オブジェクトの代わりにアプリケーション全体のイベントバスとして使用できることに注意してくださいvent

于 2013-02-15T14:55:50.623 に答える