【发布时间】:2013-08-22 14:03:52
【问题描述】:
我有一个集合 Days 实际上由 2 个集合共享 - 集合视图 v1 用于添加或删除日期(编辑),复合视图 v2 显示可点击链接以导航到各个日期的 itemView。
AppointmentManager = new Marionette.Application //app object.
//sharing collection days among two views v1, v2.
var days = new Entities.Days(ApptModel.get("apptDays"));
var v1 = new EditCollectionView({collection: days});
var v2 = new ListCompositeView({collection: days});
要删除第 2 天的约会,用户单击 collectionview v1 中 dayItemView2 上的删除按钮,这也会导致从 collection view v1 中删除这一天,如下所示:
onDeleteDayClicked() {
this.model.collection.remove(this.model);
}
这个删除也反映在视图 v2 中,因为集合在这两个视图之间共享。第 2 天的导航链接被 Marionette 从 v2 中自动删除。
集合 Days 在初始化时侦听此删除事件。为了确保这些更改在服务器端得到反映和保存(以及作为更大模型的一部分存储的其他信息,也存储天数),我在应用程序管理器上触发了一个保存事件:
Entities.Days = Backbone.Collection.extend({
initialize: function(options) {
this.on("remove", function(model,collection,index) {
AppointmentManager.trigger("appts:save");
}
});
但是在我的 ApptController 中,我收到了两次 apps:save 事件。我已经检查了 Collection Days 只收到一个删除事件并且只有一个模型被删除,因此 appts:save 触发器被称为。
ApptManager.listenTo(ApptManager, "appts:save", function() {
console.log("Saving appts!");
appts.set("days", days);
appts.save();
});
“Saving appts”打印两次,appts PUT 两次!
有什么线索吗?!
使用 Marionette v1.1.0。 我还有其他显示标题导航栏视图和其他页面的模块和应用程序。我的应用程序结构基于 Backbone.Marionette.js: A Gentle David Sulc 的介绍 - 尽管我怀疑这种包装结构是否与这个问题有任何关系。
【问题讨论】:
-
您是否尝试在
ApptManager的'appts:save'事件处理程序中设置断点?了解这两个调用的调用堆栈是否/如何不同会很有启发性。 -
调用栈是一样的
-
您是否尝试过@Tigra 将
console.log('init')添加到initialize的建议?我还会在remove处理程序中添加一个,以查看初始化和/或回调是否被调用 2x。 -
您是否发现了这一点,因为我遇到了完全相同的问题
标签: backbone.js marionette backbone-views backbone-events