Marionette JS : 在监听其他模型事件时正确清除 ItemView
Marionette JS : Properly clear ItemView when listening other model events
当 ItemView 正在监听其模型 (this.model) 以外的模型时,我是否只需要在 中关闭监听器移除 函数?并将它们的引用设置为空?我想知道 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);
},
});
不要使用 this.user.on('change:name', this.render, this);
,而是使用 listenTo() 函数。
this.listenTo(this.user, 'change:name', this.render);
Marionette 将使用来自 Backbone 的默认 destroy call the remove 方法,这将再次调用 stopListening
并清除通过 listenTo
注册的所有事件侦听器。那应该使您的整个删除功能变得不那么可怕。这些事情是 Marionette 旨在为您解决的问题之一。将 this.user
和 this.friends
设置为 null 也是不必要的。
只是为了进一步澄清。 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);
},
});
当 ItemView 正在监听其模型 (this.model) 以外的模型时,我是否只需要在 中关闭监听器移除 函数?并将它们的引用设置为空?我想知道 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);
},
});
不要使用 this.user.on('change:name', this.render, this);
,而是使用 listenTo() 函数。
this.listenTo(this.user, 'change:name', this.render);
Marionette 将使用来自 Backbone 的默认 destroy call the remove 方法,这将再次调用 stopListening
并清除通过 listenTo
注册的所有事件侦听器。那应该使您的整个删除功能变得不那么可怕。这些事情是 Marionette 旨在为您解决的问题之一。将 this.user
和 this.friends
设置为 null 也是不必要的。
只是为了进一步澄清。 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);
},
});