2012-03-12 31 views
5

Tôi đang cố gắng triển khai Điều hướng đường dẫn trên WebPage trao đổi nội dung Panel qua ajax.Nhãn Wicket chưa được cập nhật/vẫn còn ẩn

Nó kết thúc lên tim như thế này: Home >> Page >> Panel

Đây là mã trang của tôi:

public MyPage() { 
    super(); 
    contentContainer = new WebMarkupContainer("contentContainer"); 
    contentContainer.setOutputMarkupId(true); 
    add(contentContainer); 
    contentContainer.add(content = createContentPanel()); 

    breadCrumbContainer = new WebMarkupContainer("breadcrumbContainer"); 
    breadCrumbContainer.setOutputMarkupId(true); 
    add(breadCrumbContainer); 

    final AjaxLink panelLink = new AjaxLink("panelLink") { 

     @Override 
     public void onClick(final AjaxRequestTarget target) { 
      replaceContentPanel(getOverviewPanel(), target); 
     } 

     @Override 
     public boolean isVisible() { 
      return !(content instanceof OverviewPanel); 
     } 
    }; 
    breadCrumbContainer.add(panelLink); 
    panelLink.add(new Label("panelLabel", new Model<String>() { 
     @Override 
     public String getObject() { 
      //some dynamic content for example: 
      return contentPanel.getClass().getName(); 
     } 
    })); 
} 

public void replaceContentPanel(final Component replacer, final AjaxRequestTarget target) { 
    content.replaceWith(replacer); 
    content = replacer; 
    if (target != null) {   
     target.add(contentContainer); 
     target.add(breadCrumbContainer); 
    } 
} 

The Home và trang Label là dễ dàng. Bảng cho Bảng điều khiển cần được cập nhật mỗi khi tôi cập nhật nội dung Panel của số WebPage. Tôi chắc chắn rằng dòng target.add(breadCrumbContainer); sẽ thực hiện điều này. Tuy nhiên nó trống. Nhãn không hiển thị gì. Tôi đã hy vọng tìm được câu trả lời - điều này có thể hiển nhiên - trong khi viết lên câu hỏi, nhưng nó vẫn giúp tôi, vì vậy tôi hy vọng có ai đó ở đây phát hiện ra sai lầm của tôi. Tôi có thể tìm thấy câu trả lời của tôi.

+2

Tôi tự hỏi, tại sao không sử dụng các thành phần đường dẫn wicket. Kiểm tra ví dụ tại trang wicketstuff: http://wicketstuff.org/wicket/breadcrumb/ – magomi

+0

Đó là một ý tưởng hay Tôi sẽ xem xét nó. Tuy nhiên tôi vẫn tự hỏi tại sao nhãn không hiển thị? – Yashima

Trả lời

10

Khi chơi với chế độ hiển thị của thành phần thông qua Ajax, cần sử dụng setOutputMarkupPlaceholderTag(true), ngoài setOutputMarkupId(true) . Lưu ý rằng setOutputMarkupPlaceholderTag(true) sẽ tự động ngụ ý setOutputMarkupId(true). Lý do để làm như vậy là khi một thành phần được làm mới thông qua Ajax (thêm nó vào AjaxRequestTarget), Wicket trả về đánh dấu được làm mới trong phản hồi Ajax, để nó sẽ được thay thế thông qua JS-DOM API thông qua Ajax phương thức gọi lại. Vì vậy, đối với hàm JS sẽ thay thế đánh dấu đã nhận để hoạt động, cần phải có tham chiếu đến nút DOM để thay thế (thuộc tính HTML id). Đó là lý do tại sao cần có setOutputMarkupId(true).

Khi thay đổi chế độ hiển thị, nếu thành phần không hiển thị, Wicket sẽ không tạo bất kỳ đánh dấu nào cho thành phần, điều này thật tuyệt, nhưng có một nhược điểm. Nếu một thành phần vô hình hóa ra được hiển thị trong một yêu cầu ajax sau, đánh dấu của nó sẽ được trả về hiệu quả trong phản hồi Ajax. Nhưng, vì thành phần không hiển thị, nó sẽ không còn tồn tại trong đánh dấu ban đầu và sẽ không thể thay thế nút DOM tại thời gian gọi lại. Đó là nơi mà phương thức setOutputMarkupPlaceholderTag(true) có hiệu lực, bao bọc thành phần có thể không nhìn thấy được trong một thẻ giữ chỗ (tức là <div>), sẽ luôn được hiển thị với thuộc tính HTML id thích hợp.

+0

điều này thực sự thú vị, tôi sẽ kiểm tra xem, thx – Yashima

+0

Nếu đây thực sự là vấn đề, bạn sẽ gặp phải lỗi javascript trong khi thực hiện phương thức gọi lại, trong 'document.getElementById (id)' do ' không tồn tại của id' trong DOM. –

+0

Xavi López là chính xác nhưng bạn không cần đặt setOutputMarkupPlaceholderTag (true) ngoài setOutputMarkupId (true). Chỉ cần đầu tiên là đủ vì nó sẽ đặt thứ hai thành sự thật là tốt. –

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