2016-05-13 6 views
3

У меня проблема в приложении Магистральной магии, где мои детские взгляды не уничтожаются полностью. Как правильно уничтожить вложенное представление макета, которое вы заменяете другим видом макета/элемента?Магистраль макинтоша - вид макета Зомби

У меня было впечатление от Marionette documentation on destroying layout views, что, когда я устанавливаю область для отображения нового вида, старый вид уничтожается. Однако события, которые запускаются через vent, по-прежнему видны по старой видимости, которая якобы была уничтожена.

Я создал образец этого вопроса здесь: https://jsfiddle.net/dhardin/5j3x2unx/

Я считаю, что проблема связана с маршрутизатором:

App.Router = Marionette.AppRouter.extend({ 
    routes: { 
    '': 'showView1', 
    'view1': 'showView1', 
    'view2': 'showView2' 

    }, 
    showView1: function() { 
    var view1 = new App.View1(); 
    App.Layout.mainRegion.empty(); 
    App.Layout.mainRegion.show(view1); 
    }, 
    showView2: function() { 
    var view2 = new App.View2(); 
    App.Layout.mainRegion.empty(); 
    App.Layout.mainRegion.show(view2); 
    } 
}); 

App.Layout.mainRegion.empty() не требуется мое понимание, как об этом заботится, когда вид разрушен в Менеджер регионаshow() функция. Чтобы увидеть эту проблему, перейдите к другому виду с помощью навигации и нажмите кнопку. Вы увидите, что предупреждение запускается как для старого вида, так и для нового представления.

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

По сути, мой вид отображения будет вызвать следующую функцию, когда мое приложение меняется на новый вид:

Backbone.View.prototype.close = function(){ 
    this.remove(); 
    this.unbind(); 
} 

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Заранее спасибо!

ответ

1

Для таких случаев вы должны воспользоваться функцией onDestroy для выполнения дополнительных работ по очистке сверх того, что предлагает Marionette. Марионетта автоматически вызывает onDestroy, когда вид заменяется или удаляется.

onDestroy: function() { 
    App.vent.off('ButtonClicked', this.onButtonClicked, this); 
    } 

Из документации марионеток:

Обеспечивая метод OnDestroy в вашем определении вида, вы можете запустить пользовательский код для вашего зрения, что увольняют после вашей точки зрения были разрушены и очищены , Метод onDestroy будет передан любым аргументам , с которыми был вызван destroy. Это позволяет обрабатывать любой дополнительный чистый код без необходимости переопределять метод уничтожения.

Смотрите рабочую скрипку здесь: https://jsfiddle.net/ocfn574a/

Обратите внимание, что я сделал обновление опечатки в маршрутах конфигурации: 'showVeiw1' ->'showView1'

+0

Ах, очень хорошо. Похоже, я не проходил в контексте, поэтому все прослушиватели событий для «ButtonClicked» были удалены. Спасибо за помощь! :) – Dustin

1

Вы должны использовать this.listenTo(App.vent, 'ButtonClicked', this.onButtonClicked) вместо App.vent.on('ButtonClicked', this.onButtonClicked, this); таким образом марионетка ухаживает чтобы удалить всех слушателей, когда представление уничтожено, и вам не нужно явно обрабатывать событие onDestory, чтобы снять слушателя. см. обновленную скрипту here. Итак, в вашем маршрутизаторе нет проблем, но есть проблема при регистрации слушателя, так как слушатель отсутствует в объекте представления, он не получает незарегистрированных.

+0

https://jsfiddle.net/2u1nvkhv/2/ –

 Смежные вопросы

  • Нет связанных вопросов^_^