事件保持绑定到僵尸实例
event stays bound to zombie instance
我面对的是一个看起来像僵尸参考案例的东西。
首先,这是我正在使用的代码。
在这里,您将找到我的用户详细信息管理器布局要点
相反,可以在此处找到控制器
操作流程如下:
- 管理员在到达控制器上调用"manageUsers"的路由时访问用户列表。
- 管理员单击用户行,触发事件"users:selected",侦听器接收要使用的用户实例。
- DetailsLayout 在应用程序的主布局中实例化和呈现。具体说来在其"内容"区域中。
- 处理用户详细信息表单的视图也会实例化并在内部呈现DetailsLayout的"dettagli"区域。
- 此时,管理员有兴趣管理此用户的笔记。所以他点击在标有"注释"的选项卡上,注释列表将在详细信息布局"注释"区域中呈现。
- 单击管理员想要处理的注释会触发事件"notes:selected",该事件将注释实例传递给相应的事件处理程序(DetailsLayout.showNote)。
此时,一旦管理员单击触发 DetailsLayout.showUsers 的链接,进而触发上述控制器侦听的事件"users:index",他就会回到上面列表的第 1 点。
重复整个过程直到第 5 点按预期工作,但只要管理员选取注释以工作调试器显示有关未定义详细信息布局区域"注释"的错误。
逐步运行代码,我发现在第二次运行时触发的事件是正确绑定到正确的 DetailsLayout 实例,但第 6 点除外,该点仍绑定到第一次传递时使用的实例。
上面的代码显示,每次显示用户的详细信息时,都会创建一个 DetailsLayout 的新实例。这难道不足以保证没有僵尸还在吗?如果我没记错的话,每次 layout.region.show() 被命中时,它都会关闭上一个视图(取消绑定事件和所有其他事件)并附加新传递的视图。
我做错了什么?
提前感谢您的帮助。问候
附言
骨干木偶版本是0.8.4
Backbonejs 版本是 0.9.2
UserDetailsList 中的构造函数是问题所在:
constructor: (@user) ->
console.addHistory("DetailsLayout","INIT")
super()
Hub.vent.on("notes:selected",(note) => @showNote(note))
Hub.vent.on("notes:show", => @showNotes())
Hub.vent.on("notes:save", (note) => @saveNote(note))
Hub.vent.on("notes:delete", (note) => @deleteNote(note))
Hub.vent.on("notes:new", => @showNote(new Note()))
直接绑定到Hub.vent
,但从不显式解除这些事件的绑定。因此,您的用户详细信息列表实例将永远挂在内存中。
若要解决此问题,应使用布局的 bindTo
方法,该方法将跟踪绑定并在调用布局的close
方法时为您取消绑定。
constructor: (@user) ->
console.addHistory("DetailsLayout","INIT")
super()
@bindTo(Hub.vent, "notes:selected",(note) => @showNote(note))
@bindTo(Hub.vent, "notes:show", => @showNotes())
@bindTo(Hub.vent, "notes:save", (note) => @saveNote(note))
@bindTo(Hub.vent, "notes:delete", (note) => @deleteNote(note))
@bindTo(Hub.vent, "notes:new", => @showNote(new Note()))
当您不再需要布局时,请务必正确关闭布局。在布局实例上调用 close
方法。这将正确清理构造函数设置的所有bindTo
事件。
仅供参考 - Layout
直接从ItemView
延伸,因此有关ItemView
的所有信息/文档也适用于Layout
,包括使用bindTo
,close
等。
- ES6构造函数返回基类的实例
- KnockoutJS-组件-多个实例
- 为什么无法在TypeScript中导出类实例
- 如何在GoogleWeb工具包(GWT)中从JSNI调用接口(实例化)
- fluxxor向一个flux实例添加一组以上的操作
- 使用jQuery获取Dropzone实例/对象
- "实例范围”;TypeScript类的getter/setter
- 如何在速度模板中获取LiferayPortlet实例id
- 同一项怎么可能在一个实例中未定义,却在另一个实例上定义
- 实例创建(JS)
- 显示模块模式在Knockout中设置模型的新实例
- 如何获取单选按钮的多个实例的选定单选按钮值
- 当同一浏览器的两个实例浏览时,Javascript页面如何具有唯一的ID
- 在哪里可以找到RXUI Javascript'时间飞逝'实例
- spine.js在启动时填充模型实例
- 不再需要时使用jQuery/kill实例
- 如何在用户输入时实例化数组
- 从Sequelize中的非实例更新
- 如何基于数组值创建新实例
- 事件保持绑定到僵尸实例