使用preendId=“false”的UIForm中断<f:ajax呈现>

使用preendId=“false”的UIForm中断<f:ajax呈现>

我对这个事实背后的想法有一个疑问,那就是UIForm得到属性prependId..属性中未指定属性的原因NamingContainer界面?现在您可能会说,这是因为向后的可兼容性,但我更愿意打破Compability,让实现该接口的用户也为PreendId实现方法。

在我看来,主要的问题是UIForm组件是,它将崩溃。findComponent()如果我用prependId,然后NamingContainer行为将发生变化,不仅与呈现相关,而且在想要在组件树中搜索组件时也是如此。

这里有一个简单的例子:

<h:form id="test" prependId="false">
  <h:panelGroup id="group"/></h:form>

现在,当我想要获得Panel Group组件时,我希望传递字符串"group"对方法findComponent(),但它找不到任何东西,我必须用"test:group"相反。

这方面的具体问题是,当使用ajax时prependId="false"..Ajax标记希望在属性更新和处理中注意命名容器的值。有点奇怪当我用prependId="false"我必须指定完整的id或路径,但没问题。

<h:form id="test" prependId="false">
  <h:panelGroup id="group"/></h:form><h:form id="test1" prependId="false">
  <h:commandButton value="go">
    <f:ajax render="test:group"/>
  </h:commandButton></h:form>

好的,这段代码不会出现问题,但是它不会更新该小组,因为它找不到它。这个PartialViewContext将只包含id。"group"作为渲染器的元素。我不知道这是否是预期的,可能是,但我不知道代码。现在我们到了方法findComponent()找不到组件,因为作为参数传递的表达式是"group"方法所期望的"test:group"找到组件。

一个解决方案是编写自己的findComponent()这就是我选择处理这个问题的方式。在这个方法中,我处理一个组件,它是NamingContainer并将属性preendId设置为false(与普通值一样)。UIComponent..我得为每一个人做这件事UIComponent它提供了一个preendId属性,这很糟糕。反射将有助于绕过类型的静态定义,但它仍然不是一个真正干净的解决方案。

另一种方法是在NamingContainer接口和更改findComponent()像上面描述的那样工作。

最后提出的解决方案是更改ajax标记的行为以传递整个id,但这只会解决ajax问题,而不会解决findComponent()执行。

你对此有什么看法,为什么会这样实施?我不可能是第一个有这个问题的人,但是我找不到相关的话题?!


慕标5832272
浏览 359回答 2
2回答

Smart猫小萌

我面临着findComponent()算法的另一个“问题”,或者它是不同的。当我试图更新DataTable外部的特定行时,将找不到组件id。我使用的内容如下:<f:ajax呈现=“dataTableId:0:subElement”/>为什么Ajax标记不能解析组件?我查了消息来源,但不知道为什么不起作用。我应该以父命名容器作为查找的基础,然后找到DataTable,迭代行,最后找到子元素,但它没有!Ajax标签有点奇怪.。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java