Pertanyaan Apa fungsi dari @this tepatnya?


Sejauh yang saya tahu @ini adalah untuk menunjukkan komponen saat ini memicu peristiwa, seperti:

<p:commandButton process="@this" ... />

Dan di JSF 2 Ajax, itu @ini bisa juga berarti komponen encapsulating, seperti:

<h:inputText ...>
  <f:ajax execute="@this" ... />
</h:inputText>

Dan saya punya satu kasus di mana menggunakan p: datatable, termasuk atau tidak termasuk @ini dapat memiliki dampak berbeda pada pengiriman sebagian Ajax

Inilah contohnya, dalam hal ini, prosesnya sedang digunakan @ini, dan ini berfungsi seperti yang diharapkan, di mana ketika proses terjadi pertama, dan kemudian diikuti oleh setPropertyActionListener dan terakhir, tindakan dieksekusi:

<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>

Tetapi ketika saya menghilangkan @ini dari contoh ini, setPropertyActionListener dan tindakan tidak pernah dieksekusi, seolah-olah mereka tidak ada di sana.

Kenapa ya ? Mungkin @ini memiliki beberapa arti lain selain komponen saat ini, mungkin catatan saat ini dalam contoh ini?

Saya menggunakan tomcat 7, dan ini adalah ketergantungan saya:

<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>

32
2018-04-18 06:01


asal


Jawaban:


The PrimeFaces process dan JSF standar execute atribut harus menunjuk ke identifier komponen spasiparated komponen yang JSF harus proses selama siklus hidup JSF seluruh atas permintaan ajax (mendapatkan parameter permintaan, memvalidasi mereka, memperbarui model, melaksanakan tindakan). Itu process default ke @form, bentuk saat ini, dan execute default ke @this, komponen saat ini. Dalam tautan / tombol perintah, ini wajib untuk melakukan tindakan yang terkait dengan tautan / tombol itu sendiri.

Namun, dalam datatable Anda yang Anda miliki process="@this infoAnggaranForm:Anggaran", sehingga dua komponen diproses. Jika Anda mengabaikan @this tetapi simpan komponen lainnya, maka hanya akan memproses / menjalankan komponen lain dan bukan komponen tautan / tombol. Jika Anda menghilangkan process atribut itu akan menjadi default @form. Jika Anda memiliki lebih banyak komponen masukan lain dalam bentuk yang sama, maka mereka juga akan diproses.

Tergantung pada kebutuhan fungsional konkrit, Anda bisa menyimpannya process="@this infoAnggaranForm:Anggaran", atau hilangkan itu. JSF kemudian akan memproses / menjalankan setidaknya tombol dan komponen lainnya, persis seperti yang Anda inginkan.

Lihat juga:


34
2018-04-18 14:40