我有一个关于这个事实背后的理念问题,只有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"
。 阿贾克斯标签预计的属性更新和工艺,该值命名关心容器。 这是一个有点奇怪的是,当我使用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()
这是我选择处理这个问题的方式。 在该方法我处理组件,它是一个NamingContainer
并且具有属性prependId设置为假像一个正常UIComponent
。 我将不得不这样做,对于每一个UIComponent
它提供了一个prependId属性,这是不好的。 思考将有助于让周围的类型的静态清晰度,但它仍然不是一个真正干净的解决方案。
另一种方法将是引入在所述prependId属性NamingContainer
接口和改变的行为findComponent()
类似于上述工作。
最后提出的解决方案将改变AJAX标签的行为,通过全ID,但是这只能解决AJAX的问题,而不是背后的纲领性问题findComponent()
的实现。
你认为怎么样,为什么是啥玩意实现这样呢? 我不能成为第一有这个问题,但我没能找到相关的话题?