【发布时间】:2011-04-07 09:18:11
【问题描述】:
我们最近将一个项目从 Dojo 1.5 升级到了 1.6 [为了基本的 IE9 支持] 并且它损坏了我们的一个小部件。我们有一个对话框小部件 [dijit.Dialog],其中包含另一个小部件 [这里的任何小部件都会产生相同的行为],预期的行为是将内部小部件放置在对话框小部件的 contentNode 中,并且它们的每个附加点都是可通过主小部件获得。
这不会发生,而是我们只找到对话框的附加点。更多详情如下:
我们在主窗口小部件的模板中做这样的事情:
<div dojoType="dijit.Dialog" dojoAttachPoint="dia_widget"
autofocus="true" draggable="false" open="false" preventCache="true">
<div dojoType="dijit.form.ValidationTextBox" doLayout="false" dojoAttachPoint="val_widget">
</div>
</div>
这为我们提供了一个带有两个附加点的父小部件 [main_widget]:dia_widget 和 val_widget,可以通过分别调用 this.dia_widget 和 this.val_widget 在主小部件 [在 buildRendering() 函数之后] 访问它们。
升级到 1.6.0 后出现问题。
我的猜测是,当一个对话框小部件被解析时,它会将其内容的 domNode 删除到它的新 containerNode 中。当根节点分配了附加点时,由于 domNode 不再可用,它不会被添加。
我一直在调试,据我所见,buildRendering() 在 dijit/_Templated.js 中调用了_attachTemplateNodes()。这将遍历小部件中的节点,查找它们的 dojoattachpoint 属性并将它们推送到小部件的 _attachpoints 属性中。
第一个循环有两个节点[我们的 dia_widget 和 val_widget] 节点。此时,它开始单独解析每个节点,首先在 dia_widget 上调用 buildRendering() 并查找其所有子节点的连接点。
这里 main_widget 的 dom 被修改为包含已解析/渲染的 dia_widget。然后循环返回到主节点_attachTemplateNodes() 调用,它只将 dia_widget 视为子节点,丢失了 val_widget 条目。由于未找到该节点,因此它永远不会作为附加点添加到 main_widget 中,并且我们无法访问它。
我希望这不会太令人费解,我是 Dojo 的新手,在 firebug 中追逐代码并不是世界上最有趣的体验,所以我写了一些有意义的东西我。
我想知道为什么行为会从 1.5 变化到 1.6,这仅仅是我应该传递给对话框以使其行为像以前一样的功能/参数吗?这是我创建嵌套小部件的方式中的错误吗?这是道场本身的 [已知?] 错误吗?
谢谢,
维克
【问题讨论】:
-
在 #dojo 中 wuhi 的帮助下进行了更多调查:仅当小部件使用
dojox.dtl._Templated时才会出现这种情况,它适用于dijit._Templated。
标签: javascript dojo dialog nested