【问题标题】:Can't listen to a event from one view to another view in Backbone.Marionette无法在 Backbone.Marionette 中从一个视图到另一个视图监听事件
【发布时间】:2013-08-23 13:58:27
【问题描述】:

我正在尝试将代码从现有骨干网移植到骨干网.Marionette 应用程序。请参阅以下网址了解我已启动的应用程序。 http://www.adobe.com/devnet/html5/articles/backbone-cellar-pt1.html

根据我的代码结构, 我的代码中有 2 个视图。

  1. 带有表单的ItemView
  2. 包含每个 li 标签的 itemView 列表的复合视图。

最初在页面加载时,它使用 fetch() 调用从 db 呈现数据,并将所有葡萄酒名称附加到侧栏。然后,每次点击酒名,我都可以查看其对应的详细信息。 我的疑问是,除了从表单 itemView 到 CompositeView 的侦听器之外,一切都有效。我会简单解释一下。

当我在 ItemView 表单中更新/删除时,CompositeView 中的特定 li 不会通过侦听事件绑定器来更新/删除。如果我使用本地存储但不作为基于服务器/数据库的应用程序,它可以工作。 我应该怎么做才能让监听器监听来自表单 itemView 的更改并呈现它。任何建议都会帮助我继续前进。

【问题讨论】:

    标签: backbone.js marionette backbone-views backbone-events


    【解决方案1】:

    使用 Marionette CompositeView 时,将为您完成重新渲染。您不需要向模型或集合添加侦听器,因为 Marionette 会自动侦听这些事件。

    如果这不能解决您的问题,请将您的代码放在 jsfiddle 上,这样我们就有了非工作代码的功能示例。

    基于 jsFiddle 编辑:

    我添加了代码,应该使您的示例功能(没有功能示例很难确定):http://jsfiddle.net/VvXDs/ 基本上,我添加了一个应用级消息,并在如有必要,列出触发render。虽然这是功能性的,但这种模式必然会导致问题。

    让您的生活变得更加复杂的主要原因是,您管理路由的方式就像应用程序是无状态的 Web 应用程序一样(更多信息请参见 http://lostechies.com/derickbailey/2011/08/03/stop-using-backbone-as-if-it-were-a-stateless-web-server/)。

    发生的情况是,您有一个包含所有巧克力的集合,并且用户单击链接以显示其中一个。然后,尽管您已经拥有数据,但您从服务器获取要显示的模型的 实例。很明显,监听器不起作用:它们是在同一模型(服务器端)的 2 个不同实例(客户端)上定义的。 (如果您担心数据过时,您应该将相同的模型实例传递给视图,并在该实例上调用 fetch 以更新数据。)

    更好的设计方法是在您的菜单表单视图中使用相同的客户端模型实例。然后,当模型更改时,菜单行项将自动更新(因为它们使用相同的模型实例,因此“更改”事件侦听器会正确表达)。

    如果您有兴趣了解有关以有状态方式使用路由的更多信息,请查看我的书 http://samples.leanpub.com/marionette-gentle-introduction-sample.pdf(“实现路由”一章)的免费示例。

    请记住:我添加的代码应该可以工作,但设计可能会使您的开发更具挑战性...

    【讨论】:

    • 感谢您的回复。我已经在这个 url 中发布了我的代码。 jsfiddle.net/Y4yuL/3 我已经评论了我的问题。等待建议。
    • 非常感谢。我正在调查它。我看不到您在 js fiddle 中所做的更改。你能告诉我吗。我会回来进一步澄清。
    • 对不起,小提琴似乎没有正确保存。我已经在jsfiddle.net/VvXDs/4 重写了我的修改,请查看第 127、134、146-162 行。此外,第 172-176 行不是必需的。请再次注意,这种设计确实使您的生活复杂化。例如,您需要重新获取数据以更新重复的模型实例,即使更新的数据已经存在于客户端(因为它来自表单)。
    • 根据您的建议,我通过从集合(客户端)而不是从数据库获取更新模型解决了这个问题。现在监听器工作正常。非常感谢您的建议。
    • 如果解决了您的问题,请将答案标记为已接受,以帮助其他用户找到解决方案。
    猜你喜欢
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多