我面对看起来像僵尸参考案例。
首先,这是我正在使用的代码。
在这里,您可以找到我的用户详细信息管理器布局gist
相反,可以找到控制器here
操作流程如下:
此时管理员点击触发DetailsLayout.showUsers的链接,然后触发事件" users:index"他听了上述控制人的意见 回到上面列表的第1点。
重复整个过程直到第5点按预期工作,但是,只要管理员 选择要运行的注释调试器显示有关DetailsLayout区域的错误"注意"没有被定义。
逐步运行代码我发现在第二次运行时触发的事件是 正确绑定到DetailsLayout的正确实例,但第6点仍然绑定到第一次传递时使用的实例。
上面的代码显示,每次显示用户的详细信息时,都会创建一个新的DetailsLayout实例。难道这不足以保证周围没有僵尸吗?如果我从backbone.marionette文档中正确回忆起来,每次layout.region.show()被点击时,它会关闭上一个视图(解除绑定事件和所有其他视图)并附加新传递的视图。
我做错了什么?
提前感谢您的帮助。 此致
P.S。
Backbone.marionette版本为0.8.4
Backbonejs版本是0.9.2
答案 0 :(得分: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
但从未明确解除对这些事件的约束。因此,您的UserDetails列表实例永远存在于内存中。
要解决此问题,您应该使用布局的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
,包括使用{{1} },bindTo
等