2015-09-02 2 views
1

Когда ItemView прослушивает модель, отличную от его модели (this.model), мне просто нужно отключить слушатель в удалить функции? И установите их ссылку на null? Интересно, будет ли объект ItemView безопасным образом уничтожен или если у меня возникнут проблемы позже, когда будет создано или уничтожено множество просмотров, подобных этому?марионетки JS: Правильно ясно ItemView при прослушивании других типовых событий

Пример:

var FriendListItemView = Marionette.ItemView.extend({ 
    [...] 
    initialize: function(){ 
     Marionette.ItemView.prototype.initialize.apply(this, arguments); 
     // get the friend and the user from global "users" collection 
     this.user = users.get(this.model.get('user_id')); 
     this.friend = users.get(this.model.get('friend_id')); 
     this.user.on('change:name', this.render, this); 
     this.friend.on('change:name', this.render, this); 
    }, 
    remove: function(){ 
     this.user.off('change:name', this.render, this); 
     this.friend.off('change:name', this.render, this); 
     this.user = null; 
     this.friend = null; 
     Marionette.ItemView.prototype.remove.apply(this, arguments); 
    }, 
}); 

ответ

1

Вместо использования this.user.on('change:name', this.render, this); использовать функцию listenTo().

this.listenTo(this.user, 'change:name', this.render); 

марионеток будет в destroy по умолчанию вызовите remove метод из Backbone, который снова будет вызывать stopListening и очистить все слушатели событий, зарегистрированных с помощью listenTo. Это должно сделать вашу функцию удаления ненужной. Такие вещи являются одной из проблем, которые марионетка должна заботиться о вас. Установка this.user и this.friends в значение null также непроницаема.

+0

Это именно то, что я искал. Хороший, полный и ясный ответ, спасибо ivarni! – Simmoniz

+0

Из моих собственных тестов с использованием Marionette explorer, если вы не вызываете вручную this.model.destroy(); в onDestroy() модель никогда не уничтожается. – Growiel

+0

@Growiel Мне очень хотелось бы увидеть демонстрацию этого поведения, поскольку я только что связался с исходным кодом, который явно называет эти методы. Возможно, это более старая версия? – ivarni

1

только для уточнения немного дальше. Метод destroy также инициирует события и вызывает связанные методы. Кроме того, инициализация ItemView является noop, поэтому нет причин для вызова прототипа. Большинство из них имеет до и после перехвата событий, поэтому вам не нужно вызывать прототип.

var FriendListItemView = Marionette.ItemView.extend({ 
    [...] 
    initialize: function(){ 
    // get the friend and the user from global "users" collection 
    this.user = users.get(this.model.get('user_id')); 
    this.friend = users.get(this.model.get('friend_id'));   
    this.listenTo(this.user, 'change:name' this.render); 
    this.listenTo(this.friend, 'change:name' this.render); 
    }, 
    onDestroy: function(){ 
    // you could do additional clean up here if you needed to 
    // but you don't. There's also an onBeforeDestroy 
    // equivalent to this.on('destroy', this.doSomething); 
    }, 
}); 
Смежные вопросы