我有一个关于这个事实背后的想法的问题,只有UIForm获得了属性prependId。为什么在NamingContainer界面中未指定属性?你现在可能会说这是因为后向可执行性,但是我宁愿打破可比性,并让实现该接口的用户也实现了prependId的方法。
从我的角度看,在UIForm组件中的prependId的主要问题是它会中断findComponent()
我会期望如果我使用prependId,那么NamingContainer行为会改变,不仅与渲染有关,而且还要在组件树中搜索组件时。
这里有一个简单的例子:
现在当我想要获取panelGroup组件时,我希望将字符串“group”传递给findComponent()方法,但是它不会找到任何东西,所以我必须使用“test:group”。
具体的问题是,当使用ajax与prependId =“false”时。 ajax标签期望在属性更新和进程中,值指示命名容器。这有点奇怪,当我使用prependId =“false”,我必须指定完整的id或路径,但可以。
那么这个代码将不会出现问题,但是它不会更新panelGroup,因为它找不到它。 PartialViewContext将只包含id“group”作为renderIds的元素。我不知道这是否是预期的,可能是,但我不知道代码。现在我们来到方法findComponent()找不到组件的点,因为传递为参数的表达式是“group”,方法将期望“test:group”来查找组件。
一个解决方案是编写自己的findComponent(),这是我选择处理这个问题的方式。在这种方法中,我处理一个NamingContainer的组件,并将一个属性prependId设置为false,就像一个普通的UIComponent一样。我必须为提供prependId属性的每个UIComponent都这样做,那是坏的。反射将有助于摆脱类型的静态定义,但它仍然不是一个非常干净的解决方案。
另一种方法是在NamingContainer接口中引入prependId属性,并将findComponent()的行为改为如上所述。
最后提出的解决方案将改变ajax标签的行为以传递整个id,但这只会解决ajax问题,而不是findComponent()实现背后的程序问题。
你觉得怎么样,为什么这样做呢?我不能第一个有这个问题,但是我找不到相关的话题?