2009-08-06 21 views
8

Hy, Tôi muốn hiển thị một phần nhất định (ví dụ div) của mẫu wicket của tôi chỉ trong một điều kiện nhất định (ví dụ: nếu tôi có dữ liệu để điền vào). Vấn đề là:Wicket: Hiển thị có điều kiện trong Template

Nếu tôi chỉ thêm bảng điều khiển (điền vào div) nếu tôi nhận dữ liệu, một ngoại lệ sẽ được ném mỗi khi tôi gọi trang mà không có dữ liệu (vì id wicket được tham chiếu không được thêm vào thành phần-cây).

Giải pháp duy nhất mà tôi nghĩ đến là thêm bảng trống nếu không có dữ liệu. Đây không phải là giải pháp lý tưởng vì tôi có một số mã không cần thiết trong mã java và nhiều div trống trong html được hiển thị của tôi.

Vì vậy, có giải pháp tốt hơn để bao gồm một số phần của mẫu wicket chỉ trong điều kiện không?

Trả lời

4

Mặc dù đây là một câu hỏi cũ ở đây có thể là một giải pháp hơn: wicket:enclosure (và this)

Cập nhật: Bây giờ tôi cần chức năng này bằng cách tự của tôi (cho jetwick). Tôi đang sử dụng WebMarkupContainer một cho nhà nước LOGGEDIN và một cho nhà nước loggedOut và thiết lập khả năng hiển thị đúng:

if (loggedIn()) {    
    WebMarkupContainer loggedInContainer = new WebMarkupContainer("loggedIn"); 
    //## do something with the user 
    User user = getUserSomeWhere(); 
    loggedInContainer.add(new UserSearchLink("userSearchLink")); 
    add(loggedInContainer); 
    add(WebMarkupContainer("loggedOut").setVisible(false)); 
} else { 
    add(new WebMarkupContainer("loggedIn").setVisible(false)); 
    WebMarkupContainer loggedOutContainer = WebMarkupContainer("loggedOut"); 
    loggedOutContainer.add(new LoginLink() {...}); 
    add(loggedOutContainer); 
} 

Ưu điểm của việc này đối với tôi là tôi ngăn chặn một NullpointerExc trong // ## dòng đánh dấu và gửi kèm theo tính năng của wicket sẽ trông xấu hơn với tôi trong trường hợp này tôi nghĩ.

+0

Cảm ơn, thats có vẻ như là một giải pháp tốt! – theomega

+0

xem câu trả lời cập nhật của tôi – Karussell

+0

@Karussell, có một 'mới' bị thiếu ngay trên 'else' không? – aioobe

1

Tôi đoán đây là lý do tại sao có EmptyPanel. Nếu không biết về mã của bạn nhiều hơn, tôi chỉ có thể nói rằng những gì tôi nghĩ rằng bạn đang làm là một cái gì đó tôi muốn làm với sự kết hợp của một số trẻ em của AbstractRepeaterFragment. Nếu bạn sẵn sàng cho biết thêm về những gì bạn muốn làm và có thể cung cấp một số mã quá, tôi sẽ rất vui khi được giúp đỡ nhiều nhất có thể.

0

bạn có thể gọi setVisible (false); trên thành phần bạn muốn ẩn.

3

Giống như @miaubiz đã nói, bạn có thể gọi setVisible (false) hoặc bạn có thể ghi đè phương thức isVisible(), nếu khả năng hiển thị có điều kiện đối với một số trạng thái khác (ví dụ như trường được điền).

2

Yup, bạn muốn ghi đè isVisible. Điều này sẽ giữ cho isVisible = đánh dấu html giả từ thậm chí hiển thị cho trang html cuối cùng. Ngoài ra, theo các tài liệu (được đề cập trong EmptyPanel), bạn có thể sử dụng WebMarkupContainer làm thành phần gói.

this.add(new SimpleResourceModelLabel(NO_DATA_LABEL){ 
     private static final long serialVersionUID = 1L; 

     @Override 
     public boolean isVisible() { return myList.isEmpty(); } 
    }); 

    final WebMarkupContainer table = new WebMarkupContainer(MY_DATA_TABLE){ 
     private static final long serialVersionUID = 1L; 

     @Override 
     public boolean isVisible() { return !myList.isEmpty(); } 
    }; 
+0

Thêm từ các tài liệu wicket (https://cwiki.apache.org/WICKET/lifecycle-of-a-wicket-application.html): Component.render() sau các bước sau để làm cho một thành phần: 1. Xác định khả năng hiển thị thành phần. Nếu thành phần không hiển thị, Phản hồi của RequestCycle được thay đổi thành NullResponse.getInstance(), là bản thực hiện Phản hồi chỉ đơn giản loại bỏ đầu ra của nó. – jgormley

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