1

我有一个collectionview ItineraryEditorView被换入和换出布局区域的东西。相同的实例collectionView被交换使用,而不是每次都region.show创建新实例。collectioView集合上的渲染方法调用delegateEvents()方法。

    ItineraryEditorView = Marionette.CollectionView.extend({
    tagName: "div",
    emptyView: EmptyItineraryDayView,
    itemView: ItineraryDayView,
    initialize: function (options) {            
    },  
    render: function() {
        Marionette.CollectionView.prototype.render.apply(this);
        this.delegateEvents();
    },
});

视图通过关闭区域换出:

plannerLayout.itineraryEditorRegion.close();

在视图中交换:

itineraryEditorView.delegateEvents();
plannerLayout.itineraryEditorRegion.show(itineraryEditorView);

模型的删除是通过监听从itemViewto冒泡的事件来完成的collectionView(工作,这里没有问题)

itineraryEditorView.on("itemview:delete:day", function(childView, model)    {
    days.remove(model); //days coll is passed in to coll view on instance creation
    holiday.save();
});

我希望这足以确保在itemViews从基础天数集合中删除模型时删除/关闭集合视图中的子项。我可以看到集合实际上被修改并保存在服务器上,但是集合视图没有改变。这种情况当然适用于第一次换出集合视图之前。科尔。在我重新访问另一个选项卡并返回此选项卡后,视图确实会自行更新(因此呈现整个集合 - 确认更改/删除)

解决此问题的最佳方法是什么?如果我重新创建集合视图的实例,它确实会导致代码中丢失其他“打开”句柄。

4

1 回答 1

0

无需delegateEvents手动调用 - Backbone 在视图的构造函数中执行此操作。当您关闭该区域时,该区域将关闭您的视图,删除所有内部引用并解除绑定所有事件,为垃圾收集做准备。一旦一个视图已经被close()'d,它不应该被再次使用。解决您的问题的方法应该是new启动您的另一个实例ItineraryEditorView并将其传递给show.

此外,调用之前不必region.close()先调用region.show(view);首先要做的showclose()当前视图,如果有的话。我建议修改您的代码如下:

ItineraryEditorView = Marionette.CollectionView.extend({
    // tagName: "div", // <-- unnecessary as written - default tag

    emptyView: EmptyItineraryDayView,

    itemView: ItineraryDayView

    // this empty override is unnecessary as written - recommend removing it
    // initialize: function (options) {           
    // },

    // this override is unnecessary as written - remove it:
    // render: function() {
    //     Marionette.CollectionView.prototype.render.apply(this);
    //     this.delegateEvents();
    // },
});

...

// plannerLayout.itineraryEditorRegion.close(); <-- delete this line; it's not needed
// itineraryEditorView.delegateEvents();        <-- ditto

从原始帖子编辑

// define a delegate to handle events shared across multiple instances of the view:
function handleDeleteChild(childView, model) {
    days.remove(model); //days coll is passed in to coll view on instance creation
    holiday.save();
});

// create the ItineraryEditorView
// NOTE: As written this will likely conflict with your current code;
//       update as required
var itineraryEditorView = new ItineraryEditorView(options);

// bind event listeners to it
itineraryEditorView.on("itemview:delete:day", handleDeleteChild);

// show it
plannerLayout.itineraryEditorRegion.show(itineraryEditorView);
于 2013-08-30T19:57:12.500 回答