到底是什么process
和update
在PrimeFaces中p:commandXxx
组件和execute
和render
在f:ajax
标签?
在验证时,哪一项有效?什么是update
属性而不是将值从后端更新到组件?做process
是否将属性值绑定到模型?具体做什么@this
,@parent
,@all
和@form
在这两个属性中?
下面的例子运行良好,但我对基本概念有点困惑。
发布于 2014-08-17 15:33:07
The process
属性是服务器端的,并且只能影响UIComponent
S实现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
并添加
primefaces.SUBMIT
partial
或者,您也可以使用默认情况下使用此行为的OmniFaces 3.0+。
标准JSF等效于特定于PrimeFaces的process
是execute
从。它的行为完全相同,只是它不支持逗号分隔的字符串,而PrimeFaces支持(尽管我个人建议只坚持空格分隔的约定),也不支持@parent
关键字。此外,知道它的缺省值可能会很有用@form
while,缺省为@this
。最后,知道这一点也很有用process
支持所谓的"PrimeFaces选择器“,另请参阅update=“@(.myClass)”中的PrimeFaces选择器如何工作?
The update
属性是客户端的,并且可以影响所有UIComponent
s.update
属性使用一个空格分隔的客户机in列表告诉JavaScript (负责处理ajax请求/响应的那个),HTML DOM树中的哪些部分需要更新以响应表单提交。
然后,JSF将为此准备正确的ajax响应,其中包含仅限要更新的请求部件。JSF将跳过未涵盖的所有其他组件update
属性,从而保持响应有效负载较小。此外,还包括以下组件:rendered
属性的计算结果为false
将跳过渲染响应阶段。请注意,即使它会返回true
,则JavaScript无法在HTML DOM树中更新它false
。您需要包装它或更新它的父级。另请参阅Ajax更新/渲染在具有渲染属性的组件上不起作用。
通常,你会想要更新仅限这些组件真的吗需要在(部分)表单提交时在客户端“刷新”。下面的示例通过@form
(请注意process
属性被省略,因为它缺省为@form
已经)
虽然这可能会很好地工作,但在这个特定的例子中,输入和命令组件的更新是不必要的。除非您更改模型值foo
和bar
内部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=true
或ExternalContext#redirect()
进行POST后重定向。在效果上,表单process=“@update=”@ajax“@ajax”
与非ajax(非部分)提交具有完全相同的效果。在我的整个JSF职业生涯中,我遇到的唯一合理的@all
用例是在ajax请求期间出现异常的情况下完整地显示错误页面。另请参阅处理AJAXified components?的JSF2.0异常的正确方法是什么
标准JSF等效于特定于PrimeFaces的update
是render
从。它的行为完全相同,只是它不支持逗号分隔的字符串,而PrimeFaces支持(尽管我个人建议只坚持空格分隔的约定),也不支持@parent
关键字。两者都有update
和render
默认为@none
(即"nothing")。
另请参阅:
发布于 2014-08-16 19:36:05
通过进程(在JSF规范中称为execute),您告诉JSF将处理限制到指定的组件,其他所有内容都被忽略。
update指示当服务器响应您的请求时将更新哪个元素。
@all:每个组件都被处理/渲染。
@this:处理/呈现具有execute属性的请求组件。
@form:处理/呈现包含请求组件的表单。
@parent:处理/呈现包含请求组件的父组件。
有了Primefaces,你甚至可以使用JQuery选择器,看看这个博客:http://blog.primefaces.org/?p=1867
https://stackoverflow.com/questions/25339056
复制相似问题