对不起,如果我很厚,但f:ajax标签中的execute =“@ all”真的应该做什么?我希望它能够提交页面上的所有元素,但它似乎只发布封闭形式的值,而不是页面上的所有表单。
例如
<h:body>
<h:form id="form1">
Input1/Form1 <h:inputText id="testinput" value="#{testBean.input1}" />
</h:form>
<h:form id="form2">
Input2/form2 <h:inputText id="testinput2" value="#{testBean.input2}" />
<h:commandButton value="Ok" actionListener="#{testBean.al}">
<f:ajax execute="@all" />
</h:commandButton>
</h:form>
</h:body>
点击时只发布form2。
使用mojarra 2.0.2 ..
答案 0 :(得分:8)
在设计JSF2规范时,execute="@all"
只是一个主要的疏忽。 JSF有点抽象掉了基于HTML表单的本质,忘记了它最终实际上是一个HTML代码生成器。
在HTML中,提交与封闭格式不同的格式不允许。所以execute="@all"
永远不会从那个角度出发。它的行为与execute="@form"
完全相同。鉴于JSF只是一个HTML代码生成器,同样的“问题”也将触及JSF。一次处理多个<h:form>
组件是不可能的。
如果由于某种原因确实需要使用此功能,则应该退后一步并重新考虑不正确的HTML表单查看方式。您需要确保您的表单的设计方式使您永远不需要其他表单中的信息。
PrimeFaces早已意识到@all
是fundamentally wrong。这正是他们从未在@all
属性中支持process
的原因,它们等同于execute
。他们最初也从未在@all
中支持update
,相当于render
。但是,唯一真实世界的用例是在ajax异常期间处理完整的错误页面,所以他们在创建FullAjaxExceptionHandler
后最终将update="@all"
带回来。 process="@all"
仍具有与process="@form"
完全相同的效果。
但是,同样的PrimeFaces库也无意中通过其后来引入的partialSubmit="true"
功能使execute="@all"
的想象行为成为可能,您可以明确指定下面的所有其他形式(PFS { {1}}只是为了简化,像@(form)
等硬编码集合也是可能的。
:formId1 :formId2 :formId3
这是有效的,因为<p:commandButton ... process="@(form)" partialSubmit="true" />
在客户端而不是服务器端准备partialSubmit="true"
。换句话说,它不是将整个封闭表单从服务器发送到客户端然后处理指定的输入,而是仅将指定的输入从服务器发送到客户端,然后全部处理它们。请注意,当process="xxx"
不存在或设置为partialSubmit
时,它仍会发送封闭表单。不应该依赖这种不当行为。他们迟早会在这方面纠正这种不端行为。
答案 1 :(得分:4)
以下是JavaServer Faces 2.0 - The complete reference的引用,第352页:
execute和render关键字接受一组特殊关键字,每个关键字的含义如下表所示:
@all(与
execute
一起使用):页面上的每个组件都是已提交和已处理。当您想要进行整页提交时,这非常有用。
我认为这清楚地表明所有表单中的字段都应该与AJAX请求一起提交。
然而,即使使用Mojarra 2.0.3,也不会发生这种情况。尽管execute
属性的内容(无论您是放置表单列表还是@all
),只有封闭表单才会提交其“字段”。所以这看起来像个bug。除非有改变观点,否则我提出了一个问题?
答案 2 :(得分:1)
它必须是execute =“:form1 form2”(如果你有默认的分隔符),但不管怎么说,它没有。它只发送第二个。
如果你把@all放在第一个表单中,它只发送第一个表单。至少在Safari 5 / Firefox 3.6.3上。我想我们不得不看一下mojarra javascript以了解更多信息。
答案 3 :(得分:0)
你试过这个吗?
<f:ajax execute="form1 form2" />
如果你明确提到它们,它会发送两个表格的数据吗?
AFAIK,你是对的:@all代表整个页面。