如何在 Backbone.js 视图之间传递事件?

Posted

技术标签:

【中文标题】如何在 Backbone.js 视图之间传递事件?【英文标题】:How do I pass events between Backbone.js views? 【发布时间】:2014-01-13 16:06:43 【问题描述】:

我正在练习我的第一个 Backbone 应用程序,CRUD 风格。 我有modelListView,有一个链接到modelView 的编辑按钮。 modelView 有一个删除按钮来销毁模型。

现在我想要实现的是在用户返回modelListView 并且模型已成功删除时向用户显示成功消息。

我在success 中触发了model:deleted 事件,但modelListView 的监听器:

        initialize: function()
            this.on('wine:deleted', function()
                alert('wine:deleted')
            )
        ,

不能“听到”那个。这种面试沟通的最佳做法是什么?

【问题讨论】:

你检查了吗? addyosmani.github.io/backbone-fundamentals/#on-off-and-trigger 【参考方案1】:

我使用了几种方法。一种是让两个视图都引用同一个模型 - 然后您可以简单地从需要了解的任何视图中侦听来自相关模型的事件。第二种是使用event aggregator,本质上是一个事件对象,它提供了一个路由事件的位置,因此您可以减少让视图监听事件所需的对象数量。我使用哪个通常取决于应用程序的复杂性以及我需要从中路由事件的模型/集合对象的数量。

【讨论】:

事件总线的想法更吸引我。我认为有一种内置的方式或技巧可以实现我的目标。谢谢。【参考方案2】:

我认为你的基本问题是这一行:

this.on('wine:deleted', function()

你说那行代码来自modelListView,但问题是,Views 没有on 方法(只有Models 和Collections 有)。我认为您正在寻找的是:

this.model.on('wine:deleted', function()

但即使这样也不完全正确,因为命名空间看起来很有趣。如果我假设你在做:

this.trigger('deleted');

在您的 Wine 模型中,然后捕捉您只需要的事件:

this.model.on('deleted', function()

但是,即使这样似乎也有点矫枉过正,因为 Backbone 已经有一个事件可以在 Model 被破坏时使用,这不需要任何额外的 trigger 语句:

this.model.on('destroy' function()

希望对您有所帮助。

【讨论】:

感谢您指出这一点。我会用不必要的事件把我的空间弄得一团糟。

以上是关于如何在 Backbone.js 视图之间传递事件?的主要内容,如果未能解决你的问题,请参考以下文章

Backbone.js:在视图之间导航 - 销毁和重新创建

Backbone.js视图中$ el和el之间有什么区别?

Backbone.js:清除所有视图的最佳方法

Backbone.js:查看状态和路由

如何在 Backbone.js 中设置视图的 id?

如何正确渲染 Backbone.js 视图