我有一个关于事实背后的想法的问题,它只UIForm
得到了属性prependId
。为什么接口中没有指定属性NamingContainer
?您现在可能会说这是因为向后兼容性,但我更愿意打破兼容性并让实现该接口的用户也实现 prependId 事物的方法。
从我的角度来看,关于组件中 prependId 的主要问题UIForm
是,它会破坏findComponent()
我希望如果我使用prependId
,那么NamingContainer
行为会发生变化,不仅与渲染有关,而且当想要在组件树中搜索组件时也会发生变化。
这里有一个简单的例子:
<h:form id="test" prependId="false">
<h:panelGroup id="group"/>
</h:form>
现在,当我想获取 panelGroup 组件时,我希望将字符串传递"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>
好吧,这段代码将毫无问题地呈现,但它不会更新 panelGroup,因为它找不到它。将PartialViewContext
仅包含 id"group"
作为 renderIds 的元素。我不知道这是否是预期的,可能是这样,但我不知道代码。findComponent()
现在我们到了方法找不到组件的地步,因为作为参数传递的表达式是"group"
方法期望"test:group"
找到组件的地方。
一种解决方案是编写自己的解决方案,findComponent()
这是我选择处理此问题的方式。在这种方法中,我处理一个组件,它是 aNamingContainer
并且其属性 prependId 设置为 false ,就像普通的一样UIComponent
。UIComponent
对于每个提供 prependId 属性的东西,我都必须这样做,这很糟糕。反射将有助于绕过类型的静态定义,但它仍然不是一个真正干净的解决方案。
另一种方法是在界面中引入 prependId 属性NamingContainer
并改变行为findComponent()
以像上面描述的那样工作。
最后提出的解决方案是更改 ajax 标记的行为以传递整个 id,但这只会解决 ajax 问题,而不是findComponent()
实现背后的编程问题。
您对此有何看法,为什么要这样实施?我不可能是第一个遇到这个问题的人,但是我找不到相关的话题?!