什么是<f:ajax execute ="@ all">真的应该做什么?它只发布封闭表单

dav*_*ave 9 ajax jsf-2

对不起,如果我很厚,但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>
Run Code Online (Sandbox Code Playgroud)

单击时仅发布form2.

使用mojarra 2.0.2 ..

Bal*_*usC 8

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" />
Run Code Online (Sandbox Code Playgroud)

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

也可以看看:


Vít*_*uza 0

你试过这个吗?

<f:ajax execute="form1 form2" />
Run Code Online (Sandbox Code Playgroud)

如果您明确提及,它是否会发送这两种表单的数据?

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