当 ItemView 正在侦听模型(this.model)以外的模型时,我是否只需要在删除函数中关闭侦听器?并将其引用设置为null?我想知道 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);
},
});
答案 0 :(得分:1)
而不是使用this.user.on('change:name', this.render, this);
使用listenTo()函数。
this.listenTo(this.user, 'change:name', this.render);
Marionette将默认destroy调用Backbone中的remove方法,该方法将再次调用stopListening
并清除通过listenTo
注册的所有事件侦听器。这应该使你的整个删除功能unnessescary。这些事情是Marionette为您照顾的问题之一。将this.user
和this.friends
设置为null也是不合格的。
答案 1 :(得分: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);
},
});