2012-08-25 24 views
16

JSF 2.0'ın, başka bir bileşenin istemci kimliğini bulmak için yerleşik bir yöntemi var mı? SO hakkında binlerce müşteri kimliği ile ilgili soru var ve bunu yapmak için bir sürü hackish yöntemleri var, ama ben JSF 2.0 sadece bilmiyorum daha basit bir yöntem getirdiğini merak ediyorum.JSF 2.0 içindeki diğer bileşenin istemci kimliğini alma

#{component.clientId}, belirli bir bileşenin kendi istemci kimliğini değerlendirir, ancak başka bir bileşenin kimliğine başvurmak istiyorum.

This blog yayınından bahseder, ve aynı zamanda #{someComponent.clientId} çalışır, ancak söyleyebildiğim söylenemez. JSF 2.0'ın herhangi bir referans uygulamasından çıkmadan önce bunu yazdığını ve bu yüzden JSR tarafından gittiğini ve belki de bu işlevin değiştiğini yazdığını düşünüyorum. Emin değilim.

PrimeFaces ve RichFaces'ın her ikisi de bir istemci kimliği döndürmek için kendi işlevlerine sahip olduğunu biliyorum, ancak bunun için yerleşik bir JSF 2.0 yöntemi olup olmadığını merak ediyorum. İşte bazı örnekler: Bu outputText kimliğini dönmek için çalışır

.

`<h:outputText value="My client ID : #{component.clientId}" />` 

yukarıdaki blog yayınına göre, bu çalışması gerekir, ancak öyle değil. Sadece çıktı almıyorum.

`<h:button id="sampleButton" value="Sample" />` 

`<h:outputText value="sampleButton's client ID : #{sampleButton.clientId}" />` 

Bu PrimeFaces çalışır:

`<h:outputText value="PrimeFaces : sampleButton's client ID : #{p:component('sampleButton')}" />` 

İşleri richfaces içinde: Ayrıca

`<h:outputText value="RichFaces : sampleButton's client ID : #{rich:clientId('sampleButton')}" />` 

, kazandım çözümleri arıyorum eğer mümkünse' javax.faces.SEPARATOR_CHAR değerini değiştirirseniz veya başvurulanın dışında kapsayıcılar eklediğimde/kaldırırsam bileşenler. Sabit kodlanmış kimlik yollarının neden olduğu sorunları izlemek için çok zaman harcadım.

cevap

28

Bileşene, görüş alanında binding özniteliğine bir değişken adı atamanız gerekir.

<h:button id="sampleButton" binding="#{sampleButton}" value="Sample" /> 
<h:outputText value="sampleButton's client ID : #{sampleButton.clientId}" /> 
+3

Bu harika. 'Bağlama' özniteliğinin bileşenlerin çekirdek desteğine maruz kalması için özel olduğunu varsaydım - kapsamda bir bileşen de yayınlayabileceğinizi anlayamadım. Çok teşekkürler. – cutchin

+0

Rica ederim. – BalusC

+0

Ayrıca bunu yapabileceğinizi bilmiyordum! Dokümanlarda, cilt/EL kullanımıyla ilgili herhangi bir referans görmemiştim. Bu yeni JSF 2.x'te mi? (yani 1.2'de de mevcut mu?) –

1

Bu, benim için çalıştı. Yine de böyle bir cevap yazmak için Tamam olup olmadığını bilmek isterdim. Bu yana

client.html

<h:outputText value="#{UIHelper.clientId('look-up-address-panel-id')}" /> 

UIHelper.java

@ManagedBean(name = "UIHelper", eager = true) 
@ApplicationScoped 
public class UIHelper 
{ 

public String clientId(final String id) 
{ 
    FacesContext context = FacesContext.getCurrentInstance(); 
    UIViewRoot root = context.getViewRoot(); 
    final UIComponent[] found = new UIComponent[1]; 
    root.visitTree(new FullVisitContext(context), new VisitCallback() 
    { 
    @Override 
    public VisitResult visit(VisitContext context, UIComponent component) 
    { 
     if (component.getId().equals(id)) 
     { 
     found[0] = component; 
     return VisitResult.COMPLETE; 
     } 
     return VisitResult.ACCEPT; 
    } 
    }); 
    return found[0] == null ? "" : "#" + found[0].getClientId().replace(":", "\\\\:"); 
} 

} 
0

benim google arama ilk sonuçları arasında oldu ve ben bir

javax var merak ettim. el.PropertyNotFoundException (Özellik 'itemId' bulunamadı [...])

Kabul edilen çözümü denerken, çözümümü JSF 1 için paylaşmak istiyorum.2:

UIComponent 'un getClientId yönteminin FacesContext parametresine ihtiyacı vardır (bkz. UIComponent documentation). Yani bir clientId döndüren yedekleme fasulye ve ayrıca başka bir yöntemle bağlanarak ekleyin:

xhtml:

<h:button id="sampleButton" binding="#{backingBean.sampleButton}" value="Sample" /> 
<h:outputText value="sampleButton's client ID : #{backingBean.sampleButtonClientId}" /> 

Fasulye:

private UIComponent sampleButton; 

public UIComponent getSampleButton() { 
    return sampleButton; 
} 

public void setSampleButton(final UIComponent sampleButton) { 
    this.sampleButton = sampleButton; 
} 

public String getSampleButtonClientId() { 
    final FacesContext context = FacesContext.getCurrentInstance(); 
    return sampleButton.getClientId(context); 
} 

Bildirim o Size bileşeni bağlayıcı fasulye gerektiği Kapsamlı istemek veya başka bir java.lang.IllegalStateException (duplicate Id for a component) ile bitebilirsiniz (this topic ile karşılaştırın).