Javascript 主干火灾';添加';事件发生在';排序';论关系集合

Javascript 主干火灾';添加';事件发生在';排序';论关系集合,javascript,backbone.js,marionette,backbone-relational,Javascript,Backbone.js,Marionette,Backbone Relational,我会尽力详细解释我的问题,但如果有什么遗漏,请戳我一下,我会很乐意给你更多的信息 我使用的是主干0.9.10,主干关系0.7.1,下划线1.4.4 我设置了一个主干关系集合,如下所示: // ActorAssignmentCollection.js Backbone.Collection.extend({ model: AbstractActorAssignment, comparator: function (assignment) { return assig

我会尽力详细解释我的问题,但如果有什么遗漏,请戳我一下,我会很乐意给你更多的信息

我使用的是主干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');
    }
});
现在,好的部分来了:

我使用relational的.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中,“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之后触发的,而“sort”事件是在主干collection.add的第644行附近的“add”事件之后触发的。以上是什么意思?还是一只虫子?另外,我不知道这是一个特定的关系问题,还是主干本身出了问题。最后,我的问题提出了:事件应该像上面的例子那样是非阻塞的,还是我们应该更加谨慎地假设事件是按特定顺序触发的


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

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

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