Marionette 2.0 ViewDestroyedError: невозможно использовать представление, которое уже было уничтожено

Недавно я обновился до 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"... ) для перехвата события триггера.

Любая помощь в этом?


person Cheng Yong    schedule 12.08.2014    source источник
comment
Вы поняли это? У меня точно такая же проблема.   -  person Glitches    schedule 21.03.2015


Ответы (1)


Я не совсем понимаю проблему со ссылкой на представление из кода, который вы показали, но у меня есть предложение. Когда вы повторно визуализируете представление на основе изменения модели, вы можете попробовать посмотреть, уничтожено ли оно или нет:

this.listenTo(this.model, 'change', function(){
    console.log(this.isDestroyed);
    if(this.isDestroyed) return;
    this.render();
});

Если этот консольный журнал когда-либо будет истинным, вы будете вызывать рендеринг в разрушенном представлении, что даст вам эту ошибку. Вы можете попасть в эти обстоятельства, когда что-то в модели также может разрушить представление через его родителя.

Еще одна вещь, возможно, стоит упомянуть...

Ваше дочернее представление: событие передаст дочернее представление в качестве первого аргумента и объект события jQuery в качестве второго.

person Paul Falgout    schedule 22.03.2015