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.userthis.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);
  },
});