Marionette 2.0 ViewDestroyedError:无法使用已被销毁的视图

时间:2014-08-12 08:55:48

标签: javascript backbone.js marionette

最近我升级到了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" ...)的引用来拦截触发事件。

对此有何帮助?

2 个答案:

答案 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