Какова функция @this именно? - PullRequest
34 голосов
/ 18 апреля 2011

Насколько я знаю, @ 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 Ответ

37 голосов
/ 18 апреля 2011

PrimeFaces process и стандартные атрибуты JSF execute должны указывать на разделенные пробелами идентификаторы компонентов, которые JSF должен обрабатывать в течение всего жизненного цикла JSF по запросу ajax (получить параметры запроса, проверить их, обновить модель, выполнить действие) , process по умолчанию @form, текущая форма, а execute по умолчанию @this, текущий компонент. В командных ссылках / кнопках это обязательно для выполнения действий, связанных с самой ссылкой / кнопкой.

Однако в вашей таблице данных есть process="@this infoAnggaranForm:Anggaran", то есть два компонента для обработки. Если вы пропустите @this, но оставите другой компонент, тогда он будет обрабатывать / выполнять только другой компонент, а не компонент ссылки / кнопки. Если вы пропустите атрибут process, он по умолчанию будет @form. Если у вас есть другие компоненты ввода в той же форме, они также будут обработаны.

В зависимости от конкретного функционального требования, вы можете просто оставить его process="@this infoAnggaranForm:Anggaran" или пропустить его. Затем JSF обработает / выполнит, по крайней мере, как кнопку, так и другой компонент, именно так, как вы хотите.

Смотри также:

...