据我所知, @this 表示触发事件的当前组件,例如:
<p:commandButton process="@this" ... />
在JSF 2 Ajax中, @this 也可以表示封装组件,如:
<h:inputText ...>
<f:ajax execute="@this" ... />
</h:inputText>
我有一个案例,使用 p:datatable ,包括或排除 @this 会对Ajax部分提交产生不同的影响
以下是示例,在这种情况下,流程正在使用 @this ,这可以按预期工作,其中流程首先发生,然后是 setPropertyActionListener ,最后,执行操作:
<p:column>
<p:commandLink
value="#{anggaranDetail.map['code']}"
process="@this infoAnggaranForm:Anggaran"
update="detailDialogForm:Anggaran detailDialogForm:SubAnggaran"
oncomplete="infoAnggaranDialog.hide()"
image="ui-icon ui-icon-search"
action="#{tInputBean.updateAnggaranSubAnggaran}">
<f:setPropertyActionListener value="#{anggaranDetail}"
target="#{infoAnggaranBean.selectedAnggaranDetail}" />
</p:commandLink>
</p:column>
但是,当我从此示例中省略 @this 时, setPropertyActionListener 和操作永远不会执行,就好像它们不是那里。
我想知道为什么?也许 @this 除了当前组件之外还有其他一些含义,也许是本例中的当前记录?
我正在使用tomcat 7,这些是我的依赖项:
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.0.4-b09</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.0.4-b09</version>
<scope>compile</scope>
</dependency>
答案 0 :(得分:36)
PrimeFaces process
和标准JSF execute
属性应该指向JSF应该在整个JSF生命周期中根据ajax请求处理的组件的空间分隔组件标识符(获取请求参数,验证它们,更新模型) ,执行行动)。 process
默认为@form
,当前表单,execute
默认为@this
,即当前组件。在命令链接/按钮中,必须执行与链接/按钮本身相关联的操作。
但是,在您的数据表中,您有process="@this infoAnggaranForm:Anggaran"
,因此需要处理两个组件。如果省略@this
但保留其他组件,则它将仅处理/执行其他组件而不是链接/按钮组件。如果省略process
属性,则默认为@form
。如果您在同一表单中有更多其他输入组件,那么它们也将被处理。
根据具体的功能要求,您可以保留process="@this infoAnggaranForm:Anggaran"
,或省略它。然后,JSF将至少按照您的需要处理/执行按钮和其他组件。