首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >理解PrimeFaces进程/更新和JSF :ajax执行/呈现属性

理解PrimeFaces进程/更新和JSF :ajax执行/呈现属性
EN

Stack Overflow用户
提问于 2014-08-16 18:02:08
回答 2查看 272.8K关注 0票数 212

到底是什么processupdate在PrimeFaces中p:commandXxx组件和executerenderf:ajax标签?

在验证时,哪一项有效?什么是update属性而不是将值从后端更新到组件?做process是否将属性值绑定到模型?具体做什么@this@parent@all@form在这两个属性中?

下面的例子运行良好,但我对基本概念有点困惑。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-17 15:33:07

The process属性是服务器端的,并且只能影响UIComponentS实现EditableValueHolder(输入字段)或ActionSource(命令字段)。The process属性使用以空格分隔的客户机ID列表告诉JSF,在(部分)表单提交时必须在整个JSF生命周期中处理哪些组件。

然后,JSF将应用请求值(根据组件自己的客户端ID查找HTTP请求参数,然后在以下情况下将其设置为提交值EditableValueHolder组件或对新的ActionEvent在以下情况下ActionSource组件),执行转换、验证和更新模型值(EditableValueHolder组件),并最终调用排队的ActionEvent(ActionSource仅限组件)。JSF将跳过对未包含的所有其他组件的处理process属性。此外,还包括以下组件:rendered属性的计算结果为false在应用请求值期间,也将跳过阶段,作为防止篡改请求的保护措施的一部分。

请注意,它是在以下情况下使用的ActionSource组件(如)非常重要的一点是,还应将组件本身包含在process属性,特别是当您打算调用与组件关联的操作时。因此,下面的示例打算在调用某个命令组件时仅处理特定的输入组件,它将不起作用:

它将只处理#{bean.foo}和注释the #{bean.action}。您还需要包括命令组件本身:

或者,正如您显然发现的,使用@parent如果它们恰好是唯一具有共同父项的组件:

或者,如果它们都恰好是父元素的唯一组件UIForm组件,则还可以使用@form

如果表单包含更多您希望在处理过程中跳过的输入组件,这有时是不可取的,当您希望基于ajax侦听器方法中的当前输入组件更新另一个输入组件或某些UI部分时,这种情况更常见。也就是说,您不希望其他输入组件上的验证错误妨碍ajax侦听器方法的执行。

然后是@all。这在process属性,但仅限于update属性。Aprocess="@all"的行为与process="@form"。HTML不支持一次提交多个表单。

顺便说一句,还有一个@none这在您绝对不需要处理任何东西的情况下可能很有用,但是仅限我想通过以下方式更新一些特定的部件update,特别是那些内容不依赖于提交的值或操作侦听器的部分。

需要注意的是,process属性具有没有对HTTP请求负载(请求参数数量)的影响。这意味着,默认的发送包含在HTML表示中的“一切”的HTML行为将不会受到影响。如果您有一个很大的表单,并且想要将HTTP请求有效负载减少到处理过程中绝对需要的负载,即只包含process属性,则可以将partialSubmit属性在PrimeFaces Ajax组件中,如或。你也可以通过编辑来进行全局配置web.xml并添加

代码语言:javascript
复制
primefaces.SUBMIT
    partial

或者,您也可以使用默认情况下使用此行为的OmniFaces 3.0+。

标准JSF等效于特定于PrimeFaces的processexecute从。它的行为完全相同,只是它不支持逗号分隔的字符串,而PrimeFaces支持(尽管我个人建议只坚持空格分隔的约定),也不支持@parent关键字。此外,知道它的缺省值可能会很有用@formwhile,缺省为@this。最后,知道这一点也很有用process支持所谓的"PrimeFaces选择器“,另请参阅update=“@(.myClass)”中的PrimeFaces选择器如何工作?

The update属性是客户端的,并且可以影响所有UIComponents.update属性使用一个空格分隔的客户机in列表告诉JavaScript (负责处理ajax请求/响应的那个),HTML DOM树中的哪些部分需要更新以响应表单提交。

然后,JSF将为此准备正确的ajax响应,其中包含仅限要更新的请求部件。JSF将跳过未涵盖的所有其他组件update属性,从而保持响应有效负载较小。此外,还包括以下组件:rendered属性的计算结果为false将跳过渲染响应阶段。请注意,即使它会返回true,则JavaScript无法在HTML DOM树中更新它false。您需要包装它或更新它的父级。另请参阅Ajax更新/渲染在具有渲染属性的组件上不起作用。

通常,你会想要更新仅限这些组件真的吗需要在(部分)表单提交时在客户端“刷新”。下面的示例通过@form

(请注意process属性被省略,因为它缺省为@form已经)

虽然这可能会很好地工作,但在这个特定的例子中,输入和命令组件的更新是不必要的。除非您更改模型值foobar内部action方法(这反过来在UX透视图中是不直观的),那么更新它们就没有意义了。消息组件是唯一真的吗需要更新:

然而,当你有很多这样的东西时,这就变得单调乏味了。这就是PrimeFaces选择器存在的原因之一。这些消息组件在生成的HTML输出中有一个通用的样式类ui-message,因此也应该执行以下操作:

(请注意,您应该将ID保留在消息组件上,否则@(...)没用的!同样,请参阅

update=“@(.myClass)”中的PrimeFaces选择器如何工作有关详细信息,请参见)

The @parent仅更新父组件,从而覆盖当前组件和所有同级及其子项。如果您将表单分成不同的组,每个组都有自己的职责,这会更有用。The @this显然,只更新当前组件。通常,只有当您需要在action方法中更改组件自己的HTML属性之一时,才需要这样做。例如。

想象一下oncomplete需要使用value中更改的action,那么如果组件没有更新,那么这个构造就不会工作,原因很简单oncomplete是生成的HTML输出的一部分(因此,在render响应期间会计算其中的所有EL表达式)。

The @all更新整个文档,请谨慎使用。通常,您希望为此使用真正的GET请求,而不是通过普通链接( or ]或通过?faces-redirect=trueExternalContext#redirect()进行POST后重定向。在效果上,表单process=“@update=”@ajax“@ajax”与非ajax(非部分)提交具有完全相同的效果。在我的整个JSF职业生涯中,我遇到的唯一合理的@all用例是在ajax请求期间出现异常的情况下完整地显示错误页面。另请参阅处理AJAXified components?的JSF2.0异常的正确方法是什么

标准JSF等效于特定于PrimeFaces的updaterender从。它的行为完全相同,只是它不支持逗号分隔的字符串,而PrimeFaces支持(尽管我个人建议只坚持空格分隔的约定),也不支持@parent关键字。两者都有updaterender默认为@none(即"nothing")。

另请参阅:

票数 329
EN

Stack Overflow用户

发布于 2014-08-16 19:36:05

通过进程(在JSF规范中称为execute),您告诉JSF将处理限制到指定的组件,其他所有内容都被忽略。

update指示当服务器响应您的请求时将更新哪个元素。

@all:每个组件都被处理/渲染。

@this:处理/呈现具有execute属性的请求组件。

@form:处理/呈现包含请求组件的表单。

@parent:处理/呈现包含请求组件的父组件。

有了Primefaces,你甚至可以使用JQuery选择器,看看这个博客:http://blog.primefaces.org/?p=1867

票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25339056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档