带有 dojo、dgrid、TabContainer 和 JsonRest 的 DOMException
Posted
技术标签:
【中文标题】带有 dojo、dgrid、TabContainer 和 JsonRest 的 DOMException【英文标题】:DOMException with dojo, dgrid, TabContainer, and JsonRest 【发布时间】:2012-02-13 15:01:10 【问题描述】:这让我发疯了一个周末,虽然我找到了似乎可行的解决方案,但我的问题是我是否缺少使用 Dojo/Dijit 的一些基本知识。
问题是:每当我创建一个页面,其中 dgrid 使用 JsonRest 存储并且位于 TabContainer 的隐藏选项卡(不是最初选择的选项卡)中时,我会得到 DOMExceptions 和有点搞砸的 dgrid .特别是,dgrid 在最后一行数据下方有很大的空白区域,滚动到 dgrid 数据的底部或顶部会引发额外的 DOMExceptions。
如果我单击其中一个列标题对 dgrid 进行排序,它会重置其布局并正常工作。如果 dgrid 在页面的可见部分而不是未选择的选项卡上初始化,那很好。如果我使用内存存储而不是 JsonRest,一切都很好(即使 dgrid 在隐藏选项卡中初始化)。如果 dgrid 在隐藏选项卡中初始化但没有存储,则很好(但为空)。
根据证据,我猜这个问题与 JsonRest 查询需要时间有关,并且由于某种原因,它在初始化时会破坏 dgrid。我的解决方案是创建没有商店的 dgrid,然后在显示包含 dgrid 的选项卡时设置商店。不过,这似乎很笨拙。我应该能够创建一个带有商店的 dgrid,而不必在外部摆弄它。
那么,我的有点 hack-ish 的解决方案是处理使用服务器提供的数据初始化隐藏的 dgrid 的正确(或至少是合理的)方法吗,或者我的 TabContainer+dgrid+JsonRest 的设置有什么问题吗?我失踪了?
【问题讨论】:
【参考方案1】:我没有您的问题的答案,但 Dijit 小部件和容器之间存在关于小部件生命周期和启动的合同......特别是当元素被添加到 DOM 时,在最后,当调用startup()
方法对元素进行布局和调整大小时。 dgrid 可能不参与。也许您可以将某些东西连接到 TabContainer 的启动方法,这将触发 dgrid 组件的布局?
【讨论】:
如果我在某处违反合同,我不会感到惊讶; Dijit 生命周期的细节对我来说仍然有点模糊。dgrid 实际上包含在 ContentPane 中。好吧,更准确地说,它是 ContentPane 的 domNode(在 CP 的 postCreate 中,我使用它的 domNode 作为网格的连接点,如var grid = declare([Grid, DijitRegistry], ..., this.domNode)
)。只要包含选项卡被选中,网格就会自行调整为 ContentPane 的大小,这似乎是有效的。以上是关于带有 dojo、dgrid、TabContainer 和 JsonRest 的 DOMException的主要内容,如果未能解决你的问题,请参考以下文章