@this的功能究竟是什么?

时间:2011-04-18 06:01:33

标签: jsf jsf-2 primefaces

据我所知, @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>

1 个答案:

答案 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将至少按照您的需要处理/执行按钮和其他组件。

另见: