2012-02-05 28 views
5

Tôi đang cố gắng để chỉ định id cho ah: panelGroup bên trong một ui: repeatLàm thế nào tôi có thể thiết lập id của h: panelGroup bên ui: repeat

như thế

<ui:repeat value="#{dashboardPage.dashboardModel.columns}" var="column"> 
    <h:panelGroup layout="block" styleClass="#{column.id} dashboard_column" id="column_#{column.id}"> 

điều là Giá trị #{column.id} được đặt đúng bên trong giá trị styleClass nhưng không được đặt bên trong thuộc tính id tất cả đang được đặt bên trong thuộc tính id là id được tạo tự động bởi JSF + giá trị được mã hóa cứng của tôi "column_"

và nếu tôi xóa mã cứng "column_" Tôi nhận được một exce ption

java.lang.IllegalArgumentException: nhận dạng thành phần không phải là một chuỗi zero-length tại

bất kỳ ý tưởng?

Trả lời

10

Điều này là không thể với thẻ hiển thị thời gian như <ui:repeat>. Tuy nhiên, <ui:repeat> sẽ đảm bảo tính duy nhất của ID khách hàng được tạo bằng cách thêm nó vào chỉ mục hàng. Vì vậy, chỉ cần loại bỏ phần EL từ thuộc tính ID của thành phần.

Với thẻ thời gian tạo chế độ xem như <c:forEach> (về cơ bản sẽ tạo nhiều thành phần <h:panelGroup> thay vì chỉ một thành phần được hiển thị nhiều lần), có thể chỉ định ID động như thế.

<c:forEach items="#{dashboardPage.dashboardModel.columns}" var="column"> 
    <h:panelGroup layout="block" styleClass="#{column.id} dashboard_column" id="column_#{column.id}"> 

(bạn chỉ nên well aware về cách làm việc trong JSTL Facelets)

Một cách khác là sử dụng một <div> yếu tố tĩnh thay vì một <h:panelGroup layout="block"> thành phần JSF.

<ui:repeat value="#{dashboardPage.dashboardModel.columns}" var="column"> 
    <div class="#{column.id} dashboard_column" id="column_#{column.id}"> 
+0

Cảm ơn, cuối cùng tôi đã làm nó với div. Vì vậy, nó có nghĩa là tôi không thể gán ID động cho các phần tử JSF bên trong ui: tự mình lặp lại? chỉ với các phần tử HTML đơn giản – Daniel

+1

Đúng vậy. Không thể đăng ký ID thời gian hiển thị trong cây thành phần, nó phải là giá trị cố định thay vì giá trị động. Bất kể yêu cầu chức năng nào bạn đang suy nghĩ để giải quyết bằng cách tiếp cận nó như thế này, nó sẽ không phải là cách "JSF-ish" và bạn có thể cần phải suy nghĩ kỹ về điều này để tránh những bất ngờ trong tương lai. – BalusC

6

JSF tự động đặt tiền tố id. Nếu bạn chỉ đơn giản là viết id = "cột" mã HTML được tạo ra sẽ chứa mã nhận dạng đó:

myForm: 0: Cột myForm: 1: Cột myForm: 2: Cột

và vân vân.

Dù sao: Đừng bao giờ sử dụng các thẻ JSTL (như c: foreach và c: if) trong các mẫu JSF. Chúng gây ra hành vi ngẫu nhiên, rất khó gỡ lỗi. Và nếu họ làm việc, làm chậm ứng dụng rất nhiều.

Sử dụng ui: lặp lại cho vòng lặp và ui: phân đoạn cho các khối có điều kiện. Lưu ý rằng không có thay thế cho c: set, một cấu trúc như vậy không tồn tại nữa trong JSF 2.

+1

Tại sao lại là downvote? Cần giải thích. – xiefei

+0

Làm việc như một say mê và đó là một lời giải thích tuyệt vời.Tôi cũng tự hỏi tại sao nó có một downvote, nhưng tôi sẽ upvote vì nó làm cho rất nhiều ý nghĩa. –

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