2014-12-28 1 views
0

У меня странная проблема, когда метод onDestroy() моего ItemView никогда не запускается. Я использую Marionette v 2.2.1. Вот очень упрощенная версия того, что у меня есть.Backbone.js - Marionette ItemView onDestroy() никогда не назывался

myItemView.js 
------------- 

initialize: function() { 
    console.log('ItemView init'); 
    var self = this; 
    this.listenTo(eventsModel, 'change', function(){ 
    console.log('changed, lets do something'); 
    self.doSomething(); 
    }); 
    this.listenTo(eventsModel, 'destroy', function(){ 
    console.log('lets destroy ourselves'); 
    self.destroy(); 
    }); 
} 

onDestroy: function() { 
    console.log('hurray, destroyed!'); 
    this.stopListening(); 
} 

doSomething: function() { 
    console.log('doing something'); 
} 


myController.js 
--------------- 
var myView = new myItemView({model: aModel}) 
eventsModel.trigger('change'); 
eventsModel.trigger('destroy'); 

output: 
//ItemView init 
//changed, lets do something 
//doing something 
//lets destroy ourselves 

Как вы можете видеть onDestroy() никогда не срабатывает ... что мне не хватает?

+0

Это та же проблема. Также представления реализуют метод onClose. Не проверял это, но я уверен, что этот метод также срабатывает, когда вы вызываете region.close(); Afaik, вам не нужно запускать явное событие уничтожения через модель. – Trace

+0

Триггер destroy фактически представляет собой кнопку «закрыть» в приложении. У нас есть менеджер событий, отслеживающий все события, связанные с триггером, с помощью Radio. По сути, когда пользователь закрывает его, я хочу уничтожить все. Кажется, что у регионов нет близкого метода. Я довольно новичок в позвоночнике, но мне кажется, что я нахожусь в мусорной коллекции. Я не совсем понимаю, что я должен/не должен, может/не могу называть destroy on ... или он близок ...? – gjunkie

+0

Просто для этого вы можете добавить обратный вызов 'onBeforeDestroy'? Btw, события, обрабатываемые с помощью 'this.listenTo', автоматически отключаются при уничтожении представления, см. Https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.view.md#view-destroy. – seebiscuit

ответ

1

Да регионов есть близкий метод:

enter image description here

Заключительное представление должно быть столь же просто, как только закрывая область, которую я обычно от контроллера.

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

точка
var Ctr_Test = Marionette.Controller.extend({ 

    initialize: function(options){ 
     this.region = new Marionette.Region({ el: "#some-region"}); 
     this.events(); 
    }, 

    events: function(){ 
     //Trigger any event you'd like from the view to call close(); 
     Zwoop.on("app:reset", _.bind(function(){ 
      this.close(); 
     }, this)); 
    }, 

    showTest: function(){ 
     this._showTest(); 
    }, 

    _showTest: function(){ 
     //Render some views in the region 
     var itemview = new Itemview(); 
     this.region.show(itemview); 

    }, 

    //Unbind all events 
    onClose: function(){ 
     Zwoop.off("app:reset"); 
     this.region.close(); 
    } 

}); 

Один внимание всегда убирать все события, которые вы связываете в контроллере, иначе это приведет к утечкам памяти. Если вы используете listenTo в представлении, я не считаю, что вам нужно позаботиться о ручной очистке, но когда вы используете on (как и в моем примере), тогда требуется, чтобы вы вызывали «выкл» или прослушиватели событий, умножались.

+1

Хм. У меня определенно нет близкого метода. Marionette 2.2.1, Backbone 1.1.0 – gjunkie

+0

Возможно, в старых версиях используемый метод может быть уничтожен для вас или пуст. Но должен быть один доступный, иначе регионы не будут служить никакой цели. Управление Subview - это вещь Марионетты. – Trace

+0

Спасибо за ваше терпение Ким. У меня есть метод empty(). Я создал новый вид, я показываю его в регионе и сразу запускаю region.empty(). Элементы DOM удаляются, но представление все еще находится в памяти. – gjunkie