最近我升级到了Marionette 2.0.3
我意识到我一直在
ViewDestroyedError:无法使用已被销毁的视图错误
搜索此错误后,我意识到这是由于重新渲染我的视图。
以下是我目前的代码:
View.ElementPanel = Marionette.ItemView.extend({
//shorten as example
triggers: {
'click .js-show': "element:show",
},
initialize: function() {
this.listenTo(this.model, 'change',this.render);
},
})
var elementsPanelView = new View.ElementsPanel({
collection: elements
});
activityView.elementsListPanel.show(elementsPanelView);
elementsPanelView.on("childview:element:show", function(args, element) {
LessonManager.trigger("element:show", activityView.elementPanel, activity, element);
});
我意识到当属性发生变化时重新渲染模型时会破坏对视图的引用。因此渲染elementsPanelView.on(" childview:element:...)监听器失败为 当我的模型发生变化时, elementsPanelView 基本上被销毁了。
我从这个github帖子https://github.com/marionettejs/backbone.marionette/issues/1510中意识到我不应该保留一个视图的引用,因为这被认为是错误的代码。 但是,这意味着我将无法处理触发事件,因为我使用视图elementsPanelView.on(" childview:element:show" ...)的引用来拦截触发事件。
对此有何帮助?
答案 0 :(得分:2)
我不太关注你所展示代码中对视图的引用问题,但我确实有一个建议。如果您根据模型更改重新呈现视图,可以尝试查看它是否被销毁:
this.listenTo(this.model, 'change', function(){
console.log(this.isDestroyed);
if(this.isDestroyed) return;
this.render();
});
如果该控制台日志是真的,那么您将在被破坏的视图上调用渲染,这会给您带来错误。当模型上的某些东西也可以通过它的父对象来破坏视图时,你可以进入这种情况。
还有一件事值得一提......
您的childview:event会将childview作为第一个参数传递,将jQuery事件对象作为第二个参数传递。
答案 1 :(得分:-1)
var anotherView2 = new AnotherView();
mainRegion.show(anotherView2, {preventDestroy: true});
mainRegion.empty({preventDestroy: true});
使用preventDestroy https://www.w3cschool.cn/doc_marionette_3/marionette_3-marionette-region.html