2010-08-17 16 views
15

tôi cập nhật một thành phần thông qua AJAX trong JSF:Có được tiền tố đầy đủ cho một ClientId thành phần bên trong container đặt tên với JSF 2.0

<h:form> 
    <h:outputLink>Click me 
     <f:ajax event="click" render=":messages" /> 
    </h:outputLink> 
</h:form> 

<h:messages id="messages" globalOnly="true" /> 

Khi <h:messages /> cư trú bên ngoài <h:form /> Tôi có tiền tố ID với dấu hai chấm (:) . Những công việc này.

Tuy nhiên, nếu tôi đặt cùng mã này vào một thành phần và bao gồm thành phần đó vào trang của tôi, mã sẽ không thành công. Lý do là :messages khai đề cập đến thư mục gốc của hệ thống phân cấp thành phần, trong khi các thành phần <h:messages /> mà tôi muốn cập nhật thực sự nằm dưới phần tùy chỉnh của tôi, mà cư trú dưới trang (do đó vị trí là của phong cách :myComponent:messages.

Bên trong Tôi biết rằng tôi có thể gán ID theo cách thủ công cho thành phần của tôi, và sử dụng nó để tiền tố tham chiếu (như :#{cc.attrs.id}:messages) .Tuy nhiên, tôi không biết ở cấp độ nào của cấu trúc phân cấp thành phần thành phần này nằm, do đó, tiền tố bắt buộc có thể giống như một số tiền như :foo:bar:x:y:messages.

Trả lời

24

Có vẻ như bạn có thể truy cập tiền tố hiện tại qua Expression Language (EL) đối tượng ẩn (cccomponent):

  • cc.clientId lợi nhuận hiện tại composit phần của tiền tố
  • component.clientId lợi nhuận tiền tố đối với bất kỳ thành phần hiện tại.

Ví dụ, trong một trang, hãy gọi một số thành phần qua

<myComponent id="foo"> 

Bên trong thành phần này, người ta có thể lấy ID của khách hàng như thế này:

<h:outputText id="bar"> 
    <p>ClientId for the composite component: #{cc.clientId}</p> 
    <p>ClientId for current any component: #{component.clientId}</p> 
</h:outputText> 

Sau đây nên in ra như :

ClientId for the composite component: foo 
ClientId for current any component: foo:bar 

Tôi nhận con trỏ từ bài đăng blog JSF: working with component identifiers (id/clientId). Nó nói rằng đây là một tính năng mới cho JSF 2.0. Trước đó, người ta phải lấy ID theo chương trình từ một bean sao lưu.

0

@Tuukka Mustonen, cảm ơn bạn đã trả lời.

Và nếu chúng ta cần truy cập một số id khác từ "nơi" cùng chúng ta có thể sử dụng:

<h:outputScript name="js/my-script.js"/> 
<h:form id="myForm"> 
    <h:inputText id="aaa" 
     onkeyup="myJSFunction(this.id)" 
     value="..." 
    /> 
    <h:inputText id="bbb" 
     onkeyup="myJSFunction(aaa.id)" 
     value="..." 
    /> 
    <h:inputText id="ccc" 
     onkeyup="myJSFunction('#component.parent.clientId.concat(':ccc')}')" 
     value="..." 
    /> 
    <h:inputText id="ddd" 
     onkeyup="myJSFunction('#component.parent.clientId.concat(':aaa')}')" 
     value="..." 
    /> 
</h:form> 

hàm JavaScript:

function myJSFunction(message) { 
    window.alert(message) 
} 

Output trên cửa sổ hộp thoại:

1) myForm: aaa

2) null

3) myForm: ccc

4) myForm: aaa

Lưu ý: để 1 và thứ 3 có sản lượng tương tự.

Các vấn đề liên quan