gpt4 book ai didi

javascript - 在backbone.relational集合上的 'add'之后,backbone触发 'sort'事件

转载 作者:行者123 更新时间:2023-11-28 02:24:53 25 4
gpt4 key购买 nike

我会尝试详细解释我的问题,但如果缺少某些内容,请戳我,我很乐意为您提供更多信息..

我正在使用主干 0.9.10、主干关系 0.7.1、下划线 1.4.4。

我已经设置了一个像这样的主干关系集合:

// ActorAssignmentCollection.js
Backbone.Collection.extend({
model: AbstractActorAssignment,
comparator: function (assignment) {
return assignment.get('sort_index');
}
});

..并创建了一个主干 View ,它将监听器动态附加到传递的集合:

// 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');
}
});

现在,精彩的部分来了:

我使用关系的 .findOrCreate 方法来创建新的 ActorAssignment 模型:

// 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 中,“排序”事件总是在“添加”事件之后触发,但现在不再这样了。我花了几个小时尝试调试这个,这是我的结果。似乎模型上的“添加”到集合的传播被延迟,而“排序”是直接在集合上触发的,这会导致我的应用程序出现奇怪的行为.

我在主干源代码中添加了一些调试语句,这是输出:

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 之后触发,而 'sort' 事件在主干集合中的 'add' 事件之后触发。add 大约第 644 行。以上是有意的吗?或者这是一个错误?另外,我不知道这是一个特定的关系问题,还是 Backbone 本身有问题。最后,我的问题是:事件应该像上面的例子一样是非阻塞的,还是我们应该更加谨慎地假设事件按特定顺序触发?

编辑:我将 process_model 属性添加到 findOrCreate 调用中,因为这导致了我的问题,答案如下。

最佳答案

我找到了!显然,在具有与另一个模型的关系的集合模型上调用 findOrCreate 会导致backbone.relational 自动解析关系并将其添加到 processModel 上的 oneToMany 的逆关系集合中,这会在我实际添加模型之前触发添加到收藏。希望这对遇到此问题的其他人有意义。

关于javascript - 在backbone.relational集合上的 'add'之后,backbone触发 'sort'事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15117035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com