Gerçek müşteri kimliği için HTML çıktısına bakın
Doğru istemci kimliğini bulmak için oluşturulan HTML çıktısına bakmanız gerekir. Sayfayı tarayıcıda açın, sağ tıklayın ve Kaynağı Görüntüle . İlgili JSF bileşeninin HTML temsilini bulun ve id
istemci kimliği olarak alın. Geçerli adlandırma kapsayıcısına bağlı olarak mutlak veya göreli bir şekilde kullanabilirsiniz. Aşağıdaki bölüme bakın.
Not: gibi yineleme indeksi barındırıyorsa bu :0:
, :1:
(bir yineleme bileşenlerin içinde olduğu için), vs, o zaman belirli bir yineleme yuvarlak güncellenmesi her zaman desteklenmediğini gerçekleştirmek gerekir. Bununla ilgili daha fazla ayrıntı için cevabın alt kısmına bakınız.
NamingContainer
Bileşenleri ezberleyin ve onlara her zaman sabit bir kimlik verin
Ajax process / execute / update / render ile referans vermek istediğiniz bir bileşen aynı NamingContainer
ebeveynin içindeyse, sadece kendi kimliğine referans verin.
<h:form id="form">
<p:commandLink update="result"> <!-- OK! -->
<h:panelGroup id="result" />
</h:form>
E? Er değil aynı iç NamingContainer
, o zaman mutlak bir istemci kimliği kullanarak başvuru gerekiyor. Mutlak bir istemci kimliği NamingContainer
, varsayılan olarak ayırıcı karakterle başlar :
.
<h:form id="form">
<p:commandLink update="result"> <!-- FAIL! -->
</h:form>
<h:panelGroup id="result" />
<h:form id="form">
<p:commandLink update=":result"> <!-- OK! -->
</h:form>
<h:panelGroup id="result" />
<h:form id="form">
<p:commandLink update=":result"> <!-- FAIL! -->
</h:form>
<h:form id="otherform">
<h:panelGroup id="result" />
</h:form>
<h:form id="form">
<p:commandLink update=":otherform:result"> <!-- OK! -->
</h:form>
<h:form id="otherform">
<h:panelGroup id="result" />
</h:form>
NamingContainer
bileşkenler şunlardır <h:form>
, <h:dataTable>
, <p:tabView>
, <cc:implementation>
(böylece, tüm kompozit parçalar vs.) Sen oluşturulan HTML çıktısı bakarak onları kolayca tanımak, kimlik tüm alt bileşenlerinin oluşturulan müşteri kimliği başına eklenecektir. Sabit bir kimliğe sahip olmadıklarında, JSF'nin otomatik olarak oluşturulmuş bir kimliği j_idXXX
biçiminde kullanacağını unutmayın . Onlara sabit bir kimlik vererek kesinlikle bundan kaçınmalısınız. OmniFacesNoAutoGeneratedIdViewHandler
gelişimi sırasında bu faydalı olabilir.
Söz konusu javadocu bulmayı biliyorsanız UIComponent
, o zaman sadece NamingContainer
arayüzü uygulayıp uygulamadığını da kontrol edebilirsiniz . Örneğin, HtmlForm
( UIComponent
arka <h:form>
etiket) uyguladığını gösterir NamingContainer
, ancak HtmlPanelGroup
( UIComponent
arka <h:panelGroup>
etiket) bunu göstermez, bu nedenle uygulanmaz NamingContainer
. İşte tüm standart bileşenlerin javadocu ve burada PrimeFaces'in javadocu .
Sorununuzu çözme
Yani sizin durumunuzda:
<p:tabView id="tabs"><!-- This is a NamingContainer -->
<p:tab id="search"><!-- This is NOT a NamingContainer -->
<h:form id="insTable"><!-- This is a NamingContainer -->
<p:dialog id="dlg"><!-- This is NOT a NamingContainer -->
<h:panelGrid id="display">
Oluşturulan HTML çıktısı <h:panelGrid id="display">
şuna benzer:
<table id="tabs:insTable:display">
Bunu tam id
olarak istemci kimliği olarak almanız ve ardından :
kullanım için ön ekini kullanmanız gerekir update
:
<p:commandLink update=":tabs:insTable:display">
İnclude / tagfile / kompozit dışındaki referanslar
Bu komut bağlantısı bir include / tagfile içindeyse ve hedef onun dışındaysa ve bu nedenle geçerli adlandırma kapsayıcısının adlandırma kapsayıcı üst öğesinin kimliğini bilmiyorsanız, bu şekilde dinamik olarak bu şekilde başvurabilirsiniz UIComponent#getNamingContainer()
:
<p:commandLink update=":#{component.namingContainer.parent.namingContainer.clientId}:display">
Veya, bu komut bağlantısı bileşik bir bileşenin içindeyse ve hedef bileşenin dışındaysa:
<p:commandLink update=":#{cc.parent.namingContainer.clientId}:display">
Veya hem komut bağlantısı hem de hedef aynı bileşik bileşenin içindeyse:
<p:commandLink update=":#{cc.clientId}:display">
Ayrıca , oluşturma / güncelleme özelliği için şablonda üst adlandırma kapsayıcısının kimliğini alma konusuna bakın.
Örtülerin altında nasıl çalışır
Bu, tüm olarak belirtilir "ifadesini ara" in javadoc :UIComponent#findComponent()
Bir arama ifadesi bir kimliği özelliği karşı tam olarak eşleşen bir tanımlayıcı (birinden oluşur UIComponent
, ya da bağlanmış gibi tanımlayıcıları bir dizi UINamingContainer#getSeparatorChar
karakter değerinden. Alternatif alogrithms sürece kullanılabilir olsa arama algoritması olarak, aşağıdaki çalışır olmalıdır sonuç aynıdır:
UIComponent
Aşağıdaki koşullardan biri karşılanır karşılanmaz durarak, arama için temel oluşturacağını belirleyin :
- Arama ifadesi ayırıcı karakterle ("mutlak" arama ifadesi olarak adlandırılır) başlarsa, temel
UIComponent
bileşen ağacının kökü olur . Baştaki ayırıcı karakter çıkarılır ve arama ifadesinin geri kalanı, aşağıda tarif edildiği gibi "göreli" bir arama ifadesi olarak değerlendirilir.
- Aksi takdirde, eğer bu bir esas
UIComponent
ise NamingContainer
, hizmet edecektir.
- Aksi takdirde, bu bileşenin ebeveynlerini arayın. A
NamingContainer
ile karşılaşılırsa, temel olacaktır.
- Aksi takdirde (hayır
NamingContainer
ile karşılaşılırsa) kök UIComponent
taban olacaktır.
- Arama ifadesi (muhtemelen önceki adımda değiştirilmiştir), şimdi, temel bileşenin kapsamında eşleşen bir kimliği olan bileşeni (varsa) bulmak için kullanılacak "göreli" bir arama ifadesidir. Maç aşağıdaki gibi yapılır:
- Arama ifadesi basit bir tanımlayıcıysa, bu değer id özelliğiyle karşılaştırılır ve daha sonra tabanın yönleri ve alt öğeleri aracılığıyla özyinelemeli olarak
UIComponent
(bir torun NamingContainer
bulunursa, kendi yönleri ve alt öğeleri aranmaz).
- Arama ifadesi, ayırıcı karakterle ayrılmış birden fazla tanımlayıcı içeriyorsa, ilk tanımlayıcı, bir
NamingContainer
önceki madde işaretindeki kurallara göre a'yı bulmak için kullanılır . Daha sonra, arama ifadesinin kalanını geçerek bunun findComponent()
yöntemi NamingContainer
çağrılacaktır.
PrimeFaces'in JSF spesifikasyonlarına da uyduğunu, ancak RichFaces "bazı ek istisnalar" kullandığını unutmayın .
"reRender"UIComponent.findComponent()
bileşeni bileşen ağacında bulmak için algoritma (bazı ek istisnalar dışında) kullanır .
Bu ek istisnalar ayrıntılı olarak açıklanmamıştır, ancak göreceli bileşen kimliklerinin (yani, başlamayanların :
) yalnızca en yakın ebeveyn bağlamında NamingContainer
değil NamingContainer
, aynı görünümdeki diğer tüm bileşenlerde (nispeten Bu arada pahalı bir iş).
Asla kullanma prependId="false"
Bunların hepsi hala çalışmıyorsa, kullanmadığınızı doğrulayın <h:form prependId="false">
. Bu ajax gönderme ve oluşturma işlemi sırasında başarısız olur. Ayrıca bu ilgili soruya bakın: prependId = "false" sonlu UIForm <f: ajax render> .
Yinelemeli bileşenlerin spesifik yineleme turuna gönderme
Belirli bir benzeri bileşenleri yineleme öğeyi iterated başvurmak uzun süre mümkün değildi <ui:repeat>
ve <h:dataTable>
bu yüzden gibi:
<h:form id="form">
<ui:repeat id="list" value="#{['one','two','three']}" var="item">
<h:outputText id="item" value="#{item}" /><br/>
</ui:repeat>
<h:commandButton value="Update second item">
<f:ajax render=":form:list:1:item" />
</h:commandButton>
</h:form>
Bununla birlikte, Mojarra 2.2.5 <f:ajax>
onu desteklemeye başladığı için (basitçe doğrulamayı durdurdu; böylece söz konusu istisnada artık hiçbir zaman karşılaşmayacaksınız; bunun için başka bir geliştirme düzeltmesi planlanmaktadır).
Bu yalnızca geçerli MyFaces 2.2.7 ve PrimeFaces 5.2 sürümlerinde çalışmaz. Destek gelecek sürümlerde gelebilir. Bu arada, en iyi seçeneğiniz yineleme bileşeninin kendisini veya HTML'yi oluşturmaması durumunda bir üst öğeyi güncellemektir <ui:repeat>
.
PrimeFaces kullanırken Arama İfadeleri veya Seçicileri düşünün
PrimeFaces Arama İfadeleri , JSF bileşen ağacı arama ifadeleri aracılığıyla bileşenlere başvurmanıza olanak tanır. JSF'de birkaç yerleşik vardır:
@this
: geçerli bileşen
@form
: ebeveyn UIForm
@all
: tüm belge
@none
: hiçbir şey değil
PrimeFaces bunu yeni anahtar kelimeler ve bileşik ifade desteği ile geliştirdi:
@parent
: ana bileşen
@namingcontainer
: ebeveyn UINamingContainer
@widgetVar(name)
: verilen bileşen widgetVar
Ayrıca gibi kompozit ifadelerde bu anahtar kelimeleri karıştırıp @form:@parent
, @this:@parent:@parent
vb
PrimeFaces Seçicileri (PFS) , @(.someclass)
jQuery CSS seçici sözdizimi aracılığıyla bileşenlere başvurmanıza olanak tanır. Örneğin HTML çıktısında ortak bir stil sınıfına sahip referans bileşenleri. Bu, özellikle "çok" bileşene başvurmanız gerektiğinde yararlıdır. Bu, yalnızca hedef bileşenlerin HTML çıktısında tüm istemci kimliğine sahip olmasını gerektirir (sabit veya otomatik olarak oluşturulur, önemli değildir). Ayrıca bkz. PrimeFaces Seçicileri update = "@ (. MyClass)" daki gibi nasıl çalışır?