【问题标题】:ItemView event not working when triggered in onClose handler在 onClose 处理程序中触发时,ItemView 事件不起作用
【发布时间】:2014-02-07 15:30:13
【问题描述】:

我有一个 Backbone Marionette CollectonView,它正在其子视图中监听事件,如下所示:

    this.on(this, 'itemview:timeline:storyRemoved', this._storyRemoved);

itemview 在其 onClose 期间触发事件:

onClose: function () {
    this.trigger('timeline:storyRemoved', { model: this.model });
}

但 _storyRemoved 函数从未被调用。

如果我将触发器移到 onShow 则它工作正常:

onShow: function () {
    this.trigger('timeline:storyRemoved', { model: this.model });
}

我猜这与视图已关闭因此不再位于集合视图中的事实有关?

有什么办法让它工作吗?

【问题讨论】:

    标签: backbone.js marionette


    【解决方案1】:

    你说得对,视图没有在监听,因为在你触发事件时它已经关闭了。

    根据你在做什么,模型本身不应该触发这个事件吗?这样,您可以在集合视图中添加类似这样的内容:

    collectionEvents: {
      'remove': '_storyRemoved'
    }
    

    As you can see here,移除模型将触发移除事件,并引用已移除的模型。

    【讨论】:

    • 嗨,是的,我先尝试过,但发现触发此事件时 itemview 尚未从 collectionview 中删除。我需要 DOM 是最新的,以便我可以重组剩余的项目。到目前为止,我所做的正是您的建议,但使用了 1ms 的 settimeout 来确保更新 DOM。
    【解决方案2】:

    我喜欢 gbsice 的观点,并且我还想添加一个更通用的答案:如果您需要在 close 事件之前执行某些操作,则可以使用 onBeforeClose 而不是 onClose

    https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.collectionview.md#onbeforeclose-callback

    所以在你的情况下,它会是

    onBeforeClose: function () {
      this.trigger('timeline:storyRemoved', { model: this.model });
    }
    

    【讨论】:

    • 我认为这个解决方案的问题是如果你看here,你可以看到collection view停止监听item view之前调用close项目视图上的方法,它本身会触发onBeforeCloseonClose 方法。这意味着即使 onBeforeClose 在这种情况下也不起作用。
    • 我看不出来...如果是这样的话,onBeforeClose的目的是什么?
    • 谢谢,不知道那个事件。我会试一试并报告!
    • @tyler 我相信 onBeforeClose 的目的是在清除项目视图 DOM 之前进行任何类型的 DOM 处理。它更多的是关于视图本身的 DOM,而不是关于从 CollectionView 中删除的 ItemView
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2019-09-22
    • 1970-01-01
    相关资源
    最近更新 更多