Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带prependId的UIForm=";假;休息<;f:ajax渲染>;_Ajax_Forms_Jsf_Naming Containers - Fatal编程技术网

带prependId的UIForm=";假;休息<;f:ajax渲染>;

带prependId的UIForm=";假;休息<;f:ajax渲染>;,ajax,forms,jsf,naming-containers,Ajax,Forms,Jsf,Naming Containers,我对这个事实背后的想法有一个疑问,即只有UIForm获得了属性prependId。为什么在NamingContainer界面中未指定该属性?你现在可能会说这是因为向后兼容,但我更愿意打破这种兼容,让实现该接口的用户也实现prependId的方法 从我的角度来看,UIForm组件中prependId的主要问题是,它将破坏findComponent() 我希望如果我使用prependId,那么NamingContainer行为将发生变化,不仅与渲染有关,而且在希望在组件树中搜索组件时也会发生变化 这

我对这个事实背后的想法有一个疑问,即只有
UIForm
获得了属性
prependId
。为什么在
NamingContainer
界面中未指定该属性?你现在可能会说这是因为向后兼容,但我更愿意打破这种兼容,让实现该接口的用户也实现prependId的方法

从我的角度来看,
UIForm
组件中prependId的主要问题是,它将破坏
findComponent()
我希望如果我使用
prependId
,那么
NamingContainer
行为将发生变化,不仅与渲染有关,而且在希望在组件树中搜索组件时也会发生变化

这里有一个简单的例子:

<h:form id="test" prependId="false">
  <h:panelGroup id="group"/>
</h:form>
这段代码将毫无问题地呈现,但它不会更新panelGroup,因为它找不到它。
PartialViewContext
将只包含id
“group”
作为渲染元素。我不知道这是否是预期的,可能是,但我不知道代码。现在我们到了方法
findComponent()
找不到组件的地步,因为作为参数传递的表达式是
“group”
,方法希望
“test:group”
找到组件

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

另一种方法是在
NamingContainer
接口中引入prependId属性,并将
findComponent()
的行为更改为如上所述

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

你是怎么想的?为什么要这样实施?我不可能是第一个有这个问题的人,但我找不到相关的话题

实际上,
执行的
UIComponent#findComponent()
在使用
时失败。这个问题是已知的,是一个“无法修复的”:

在我看来,在JSF1.2时代,他们不应该在
UIForm
中添加
prependId
属性。这样做仅仅是为了让想要使用JSF表单和JSF输入组件的用户感到高兴(
j_security_check
需要精确的输入字段名
j_用户名
j_密码
,配置无法修改)。但他们并没有完全意识到,在JSF1.2中引入了另一个改进,使您能够继续使用
而不是坚持使用
。然后CSS/jQuery纯粹主义者开始滥用
prependId=“false”
,以避免在错误选择的CSS选择器中转义分隔符

永远不要使用
prependId=“false”

对于
j_security\u check
,只需使用
或新的Servlet 3.0
HttpServletRequest#login()
。另见

对于CSS选择器,如果您绝对需要一个ID选择器(因此不是一个更可重用的类选择器),只需将感兴趣的组件包装在一个普通的HTML
中即可

另见:
事实上,
执行的
UIComponent#findComponent()
在使用
时失败。这个问题是已知的,是一个“无法修复的”:

在我看来,在JSF1.2时代,他们不应该在
UIForm
中添加
prependId
属性。这样做仅仅是为了让想要使用JSF表单和JSF输入组件的用户感到高兴(
j_security_check
需要精确的输入字段名
j_用户名
j_密码
,配置无法修改)。但他们并没有完全意识到,在JSF1.2中引入了另一个改进,使您能够继续使用
而不是坚持使用
。然后CSS/jQuery纯粹主义者开始滥用
prependId=“false”
,以避免在错误选择的CSS选择器中转义分隔符

永远不要使用
prependId=“false”

对于
j_security\u check
,只需使用
或新的Servlet 3.0
HttpServletRequest#login()
。另见

对于CSS选择器,如果您绝对需要一个ID选择器(因此不是一个更可重用的类选择器),只需将感兴趣的组件包装在一个普通的HTML
中即可

另见:
我面临findComponent()算法的另一个“问题”,或者它是另一个问题。当我尝试更新数据表外部的特定行时,则找不到组件id。我使用这样的方法:为什么ajax标记不能解析组件?我检查了来源,但不知道为什么它不起作用。我应该以父NamingContainer作为查找的基础,然后找到dataTable,迭代到行,最后找到子元素,但它没有!Ajax标记有点奇怪……我面临findComponent()算法的另一个“问题”,或者是其他问题。当我尝试更新特定的
<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>