将孩子添加到父母后是不是必须调用 doLayout() 方法?

Posted

技术标签:

【中文标题】将孩子添加到父母后是不是必须调用 doLayout() 方法?【英文标题】:Is calling doLayout() method a must after adding child to a parent?将孩子添加到父母后是否必须调用 doLayout() 方法? 【发布时间】:2012-06-28 07:05:57 【问题描述】:

在我们的应用程序中,有一个标签面板,我们在其中动态添加/删除面板。

通过菜单处理程序中的以下代码单击菜单项添加面板:

Ext.getCmp('mainTabPanelId').add(getPanel());

这里getPanel()方法创建后返回面板。

假设主标签面板的id是mainTabPanelId,子面板的id是panelId,在这种情况下,有人可以指导一下:

    add方法后是否需要在mainTabPanel上调用doLayout()? 应该在mainTabPanel 或新添加的子面板上调用doLayout(),即Ext.getCmp('mainTabId').doLayout()Ext.getCmp('panelId').doLayout()? 调用 doLayout() 是否会处理所有与渲染相关的问题,例如滚动条? 方法getPanel() 应该返回一个已经创建的面板(使用Ext.create)还是应该返回一个配置对象(使用xtype:'panel')?在牢记时间的情况下,应该首选哪一个以获得更好的性能?

【问题讨论】:

【参考方案1】:

AbstractContainer::add()

<...> 如果 Container 配置了尺寸管理布局管理器,此时 Container 也会重新计算其内部布局。

所以你不必这样做 13 因为:

AbstractContainer::doLayout()

<...> 在大多数情况下,框架在内部使用它来刷新布局。

AbstractContainer::defaults

为了使默认值起作用,必须使用 xtype: ...... 添加子项,而不是使用 Ext.create("widget.type",) © roger.spall

所以我更喜欢返回配置对象而不是组件本身。

【讨论】:

感谢 o_nix 的帖子。不幸的是,如果我们不调用 doLayout(),那么布局看起来会损坏,但是一旦调用 doLayout(),所有问题(如出现滚动条等)都会得到修复。我们在许多浏览器中对此进行了测试,发现在动态添加之后必须调用 doLayout()。

以上是关于将孩子添加到父母后是不是必须调用 doLayout() 方法?的主要内容,如果未能解决你的问题,请参考以下文章

收到错误“您必须首先在孩子的父母上调用removeView()”

指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()

如何将两个孩子添加到数据库中的父母

指定的孩子已经有一个父母。您必须首先在孩子的父母上调用 removeView()。 (C#)

指定的孩子已经有一个父母。您必须首先在孩子的父母上调用 removeView() (Android)

冲突的 Android 错误消息:指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()