10

对不起,如果我很厚,但是 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..

4

4 回答 4

9

execute="@all"只是设计 JSF2 规范期间的一个重大疏忽。JSF 有点抽象掉了太多基于 HTML 表单的特性,忘记了它最终实际上是一个 HTML 代码生成器。

HTML中,不允许提交与封闭表单不同的表单。所以execute="@all"永远不会从这个角度工作。它的行为与execute="@form". 鉴于 JSF 只是一个 HTML 代码生成器,同样的“问题”也会遇到 JSF。<h:form>一次处理多个组件是不可能的。

如果出于某种原因你真的需要这个功能,你应该退后一步,重新考虑你看待 HTML 表单的错误方式。您需要确保您的表单的设计方式使您永远不需要来自其他表单的信息。

也可以看看:


PrimeFaces 很早就意识到这@all根本错误的。这正是他们从不支持属性的原因@allprocess它们相当于execute. 他们最初也从未支持@allupdate,他们相当于render。但是,唯一有意义的真实用例是在 ajax 异常期间处理完整的错误页面,因此它们最终update="@all"在我创建FullAjaxExceptionHandler. 将process="@all"仍然具有与 完全相同的效果process="@form"

然而,同一个 PrimeFaces 库也无意中execute="@all"通过其后来引入partialSubmit="true"的功能使想象的行为成为可能,您可以明确指定所有其他形式,如下所示(PFS @(form)只是为了简化,硬编码集合:formId1 :formId2 :formId3等也是可能的)。

<p:commandButton ... process="@(form)" partialSubmit="true" />

这是有效的,因为partialSubmit="true"准备process="xxx"客户端而不是服务器端。换句话说,它不是将整个封闭表单从服务器发送到客户端,然后处理指定的输入,而是仅将指定的输入从服务器发送到客户端,然后将它们全部处理。请注意,当partialSubmit不存在或设置为时false,它仍然只会发送封闭的表格。这种不当行为不应该被依赖。他们迟早会纠正这种不当行为。

也可以看看:

于 2015-12-19T15:47:37.070 回答
4

这是来自JavaServer Faces 2.0 - The complete reference,第 352 页的引述:

execute 和 render 关键字接受一组特殊关键字,每个关键字的含义如下表所示:

@all(使用 with execute):页面上的每个组件都被提交处理。当您想要进行整页提交时,这很有用。

我认为这很清楚地表明所有表单的字段都应与 AJAX 请求一起提交。

然而,即使使用 Mojarra 2.0.3,这也不会发生。尽管execute属性的内容(无论您放置表单列表还是@all),只有封闭的表单会提交其字段。所以这似乎是一个错误。除非有改变的观点,否则我会提出一个问题?

于 2010-10-11T12:51:43.227 回答
1

它必须是 execute=":form1 form2" (如果你有默认分隔符),但无论如何不,它没有。它只发送第二个。

如果您将@all 放在第一种形式中,它只会发送第一种形式。至少在 Safari 5/Firefox 3.6.3 上。我想人们必须查看 mojarra javascript 才能了解更多信息。

于 2010-06-10T16:27:20.800 回答
0

你试过这个吗?

<f:ajax execute="form1 form2" />

如果您明确提及它们,它会发送两种形式的数据吗?

AFAIK,你是对的:@all 代表整个页面。

于 2010-06-10T12:46:34.247 回答