私は私の問題を詳細に説明しようとしますが、何かが足りない場合は、私を突いてください。喜んで追加情報を提供します。
バックボーン0.9.10、バックボーンリレーショナル0.7.1、アンダースコア1.4.4を使用しています。
次のようなバックボーンリレーショナルコレクションを設定しました。
// ActorAssignmentCollection.js
Backbone.Collection.extend({
model: AbstractActorAssignment,
comparator: function (assignment) {
return assignment.get('sort_index');
}
});
..そして、渡されたコレクションにリスナーを動的にアタッチするバックボーンビューを作成しました。
// ActorDisplay.js
Backbone.View.extend({
attachListeners: function (collection) {
this.listenTo(collection, 'add', _.bind(this.onAdd, this));
this.listenTo(collection, 'sort', _.bind(this.onCollectionSort, this));
},
onAdd: function () {
console.log('onAdd fired');
},
onCollectionSort: function() {
console.log('onCollectionSortFired');
}
});
さて、ここに良い部分があります:
新しいActorAssignmentモデルを作成するために、リレーショナルの.findOrCreateメソッドを使用します。
// AddAssignmentCommand:
execute: function (data) {
var sortIndex = data.collection.length,
actorAssignment = data.collection.model.findOrCreate({
actor: data.actor,
sort_index: sortIndex,
process_model: data.processModel
});
data.collection.add(actorAssignment);
}
以前は、バックボーン0.9.2では、「sort」イベントは常に「add」イベントの後に発生していましたが、現在は発生していません。これをデバッグするのに何時間も費やしましたが、これが私の結果です。モデルでの「add」のコレクションへの伝播が遅れているようですが、「sort」はコレクションで直接トリガーされるため、アプリケーションで奇妙な動作が発生します。
バックボーンのソースコードにいくつかのデバッグステートメントを入れました。これが出力です。
triggering add events.. 6dd47c9_backbone_1.js:641
triggering add event on model 6dd47c9_backbone_1.js:644
trigger: add fired 6dd47c9_backbone_1.js:182
triggering sort events.. 6dd47c9_backbone_1.js:647
trigger: sort fired 6dd47c9_backbone_1.js:182
*onCollectionSortFired* ControlStructureActorDisplay.js:136
trigger: relational:add fired 6dd47c9_backbone_1.js:182
trigger: change:entity_type fired 6dd47c9_backbone_1.js:182
trigger: change:entity_type fired 6dd47c9_backbone_1.js:182
trigger: change:entity_type fired 6dd47c9_backbone_1.js:182
trigger: change:entity_type fired 6dd47c9_backbone_1.js:182
trigger: change:actor fired 6dd47c9_backbone_1.js:182
trigger: change:actor fired 6dd47c9_backbone_1.js:182
trigger: change:actor fired 6dd47c9_backbone_1.js:182
trigger: change:actor fired 6dd47c9_backbone_1.js:182
trigger: change:process_step fired 6dd47c9_backbone_1.js:182
trigger: change:process_step fired 6dd47c9_backbone_1.js:182
trigger: change:process_step fired 6dd47c9_backbone_1.js:182
trigger: change:process_step fired 6dd47c9_backbone_1.js:182
trigger: change:sort_index fired 6dd47c9_backbone_1.js:182
trigger: change:sort_index fired 6dd47c9_backbone_1.js:182
trigger: change:sort_index fired 6dd47c9_backbone_1.js:182
trigger: change:sort_index fired 6dd47c9_backbone_1.js:182
trigger: change fired 6dd47c9_backbone_1.js:182
trigger: change fired 6dd47c9_backbone_1.js:182
trigger: change fired 6dd47c9_backbone_1.js:182
trigger: change fired 6dd47c9_backbone_1.js:182
trigger: add fired 6dd47c9_backbone_1.js:182
trigger: add fired 6dd47c9_backbone_1.js:182
trigger: add:actor_assignments fired 6dd47c9_backbone_1.js:182
trigger: add:actor_assignments fired 6dd47c9_backbone_1.js:182
trigger: add fired 6dd47c9_backbone_1.js:182
*onAdd fired* ControlStructureActorDisplay.js:155
ご覧のとおり、onAddはonCollectionSortの後に発生しますが、バックボーンcollection.addの644行目あたりの「add」イベントの後に「sort」イベントがトリガーされます。それともバグですか?また、これが特定の関係の問題なのか、それともバックボーン自体に何か問題があるのかはわかりません。最後に、私の質問が提起します。上記の例のようにイベントをブロックしないようにする必要がありますか、それともイベントが特定の順序で発生すると想定する場合はもっと注意する必要がありますか?
編集:私の問題を引き起こしたので、findOrCreate呼び出しにprocess_modelプロパティを追加しました。答えは以下のとおりです。