【问题标题】:Backbone Marionette redisplaying (showing) a nested layout fails due to 'undefined' region由于“未定义”区域,Backbone Marionette 重新显示(显示)嵌套布局失败
【发布时间】:2012-08-17 11:28:25
【问题描述】:

我有一个带有嵌套布局的应用程序。顶级布局位于 App 级别,第二级位于其区域之一。当我显示二级布局时,我会触发一个事件来显示二级布局的区域。这第一次工作正常,但是当我将第二级布局与其他视图或布局交换并再次显示时它失败了。问题在http://jsfiddle.net/mzafer/VLY4t/ 重新创建

在屏幕上单击“Content1”,然后单击“Content 2”。您将看到显示的二级布局区域(“这是实际的 region1 内容”和“这是实际的 region2 内容”)。现在单击“Content1”,然后再次单击“Content 2”。这次不显示实际内容,而只是显示占位符。在第二次“thisView.region1”未定义。

知道是什么导致该区域未定义吗?

谢谢 扎菲尔

【问题讨论】:

    标签: backbone.js marionette


    【解决方案1】:

    代码有两个问题。

    首先,您应该使用MyApp.vent.bindTo() 而不是MyApp.vetn.bind() 以确保正确管理事件。

    其次,你需要在布局视图关闭时解除与事件的绑定。现在发生的情况是,因为您没有解除绑定,您最终会得到一个封闭的视图(第一个实例),但仍试图访问其不再存在的区域元素。

    以后,您可以通过将 this.cid 附加到您的 console.log 语句来检测到这一点。例如:

    console.log('Responding to an event.', this.cid);
    

    我调整了您的代码以使其正常工作,并进行了上述两项更改:http://jsfiddle.net/VLY4t/14/

    【讨论】:

    • +1 有 1 个小点:不要在视图中使用 MyApp.vent.bindTo,而应在视图中使用 this.bindTo。这样,在关闭视图时会为您处理清理工作:this.bindTo(MyApp.vent, "some:event", this.whateverCallback, this);
    • 谢谢,效果很好。我认为旧视图可能会挥之不去,但不确定是否能检测到它。
    • 还有 Derick,当你在这里的时候,你能不能给我指出一个资源来解释 vent.on、vent.bind 和 vent.bindTo 的使用。
    • @DerickBailey 啊哈!我试图弄清楚如何做到这一点,所以它是自动的,但从阅读源代码和文档中看并不明显。将此用例添加到docs/marionette.eventbinder.mddocs/marionette.application.md 会很有帮助,目前在示例中使用bind
    • 此 wiki 页面可能有助于解释更多内容:github.com/derickbailey/backbone.marionette/wiki/… - 如果您认为它需要更多信息,请告诉我,或者继续自己更新页面。我喜欢看到社区贡献:)
    猜你喜欢
    • 1970-01-01
    • 2021-01-05
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    相关资源
    最近更新 更多