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();
});

Ако този регистрационен файл на конзолата някога е верен, ще извикате рендиране на унищожен изглед, което ще ви даде тази грешка. Можете да попаднете в тези обстоятелства, когато нещо в модела може също да унищожи изгледа чрез своя родител.

Още нещо, което си струва да се спомене...

Вашето събитие childview: ще предаде childview като първи аргумент и обект на събитие jQuery като втори.

person Paul Falgout    schedule 22.03.2015