/ / backbone fires 'add' event after 'sort' on backbone.relational collection - javascript, backbone.js, marionette, backbone-relational

backbone fires 'add' event po 'sort' w kolekcji backbone.relational - javascript, backbone.js, marionetka, backbone-relational

Spróbuję szczegółowo wyjaśnić mój problem, ale jeśli czegoś brakuje, proszę szturchnij mnie i chętnie udzielę dodatkowych informacji.

Używam szkieletu 0.9.10, relacyjnego szkieletu 0.7.1, podkreślenia 1.4.4.

Zainstalowałem relacyjną kolekcję szkieletową, taką jak ta:

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

..i utworzył widok szkieletowy, który dynamicznie dołącza słuchaczy do przekazanej kolekcji:

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

A teraz dobra część:

Używam relacyjnej metody .findOrCreate do tworzenia nowego modelu 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);
}

Przedtem z kręgosłupem 0,9.2, zdarzenie „sort” było zawsze uruchamiane po zdarzeniu „dodaj”, ale już nie. Spędziłem godziny próbując to debugować, a oto mój wynik. Wygląda na to, że propagacja „dodawania” w modelu do kolekcji jest opóźniona, podczas gdy „sortowanie” jest wywoływane bezpośrednio w kolekcji, co powoduje dziwne zachowanie w mojej aplikacji .

Umieściłem kilka instrukcji debugowania w kodzie źródłowym sieci szkieletowej, oto wynik:

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

Jak widać, onAdd jest uruchamiany poonCollectionSort, podczas gdy zdarzenie „sort” jest wywoływane PO zdarzeniu „add” w kolekcji szkieletowej. dodawane wokół linii 644. Czy jest to zamierzone powyżej? Czy to błąd? Nie wiem też, czy jest to konkretny problem relacyjny, czy coś jest nie tak z samym kręgosłupem. Wreszcie moje pytanie nasuwa się: czy zdarzenia nie blokują się, jak w powyższym przykładzie, czy też powinniśmy być bardziej ostrożni przy zakładaniu, że zdarzenia zostaną wywołane w konkretne zamówienie?

EDYCJA: Dodałem właściwość process_model do wywołania findOrCreate, ponieważ to spowodowało mój problem, odpowiedź jest poniżej.

Odpowiedzi:

1 dla odpowiedzi № 1

Znalazłem to! Najwyraźniej wywołanie findOrCreate na modelu kolekcji z relacją do innego modelu powoduje, że backbone.relational automatycznie rozwiązuje relację i dodaje ją do kolekcji odwrotnej relacji my oneToMany w modelu ProcessModel, która wyzwala dodawanie przed faktycznym dodaniem mojego modelu do kolekcji. Mam nadzieję, że ma to sens dla innych, którzy napotykają ten problem.