2012-08-13 68 views
2

我已經使用Apache Wicket中的DefaultDataTable對象打印了一個表。
現在我想添加一個鏈接到每個表格單元格。添加到wicket中的表的鏈接

我發現this link其中解釋了一些,但我有第一種方法的問題。

columns[0] = new TextFilteredPropertyColumn(new Model("Id"), "id", "id") { 
     // add the LinkPanel to the cell item 
     public void populateItem(Item cellItem, String componentId, IModel model) { 
      final Transaction transaction = (Transaction) model.getObject(cellItem); 
      cellItem.add(new TransactionList.LinkPanel(componentId, transaction)); 
     } 
    }; 


private class LinkPanel extends Panel { 
    public LinkPanel(String id, Transaction transaction) { 
     super(id); 
     final String name = transaction.getId(); 
     PageParameters param = new PageParameters("id=" + name); 
     BookmarkablePageLink link = new BookmarkablePageLink("link", TransactionDetail.class, param); 
     link.add(new Label("label", name)); 
     add(link); 
    } 

什麼是交易以及交易是做什麼的?什麼是LinkPanel類?如果有更簡單的方法,我很樂意知道它!

回答

4

「交易」是在模型對象該單元格(它可能來自示例,因爲它不是來自檢票口)。 「LinkPanel」類是一個內部類,它也不是來自wicket。這門課的目的是製作一個包含鏈接的面板。您可以直接添加單元格中的鏈接,而無需像LinkPanel

columns[0] = new TextFilteredPropertyColumn(new Model("Id"), "id", "id") { 
// add the LinkPanel to the cell item 
public void populateItem(Item cellItem, String componentId, IModel model) { 
    cellItem.add(new Link<String>(componentId) { 

     @Override 
     public void onClick() { 
     setResponsePage(aPage.class); 
     //or do what you want when the link is clicked 
     } 

     @Override 
     public IMarkupFragment getMarkup() { 
      // display the content you like - access the properties of your object 
      return Markup.of("<div wicket:id='cell'>" + model.getObject() + "</div>"); 
     } 
    }); 

    // Populate your item here 
} 
}; 

面板,但我會建議保持內板(如LinkPanel)的方式,我認爲這是一個更好的做法,然後直接添加鏈接。通過使用內部面板,您可以非常輕鬆地將標籤或圖像添加到鏈接中,如果您直接添加鏈接,這會變得更加困難。

下面是當我需要添加鏈接表中的我usualy做什麼(請注意,CallDetailRecord是不是從檢票口,它只是我在這種情況下使用的對象):

... 

columns.add(new UserActionsColumn(new Model<String>(" "))); 

... 

private class UserActionsColumn extends AbstractColumn<CallDetailRecord> { 
private static final long serialVersionUID = 1L; 

public UserActionsColumn(IModel<String> displayModel) { 
    super(displayModel); 
} 

@Override 
public void populateItem(Item<ICellPopulator<CallDetailRecord>> cellItem, 
         String componentId, 
         final IModel<CallDetailRecord> rowModel) 
{ 
    cellItem.add(new UserActionPanel(componentId, rowModel)); 
} 
} 

private class UserActionPanel extends Panel { 
private static final long serialVersionUID = 1L; 

public UserActionPanel(String id, final IModel<CallDetailRecord> model) { 
    super(id); 
    add(new AjaxLink<CallDetailRecord>("viewLink", model) { 
    private static final long serialVersionUID = 1L; 

    @Override 
    public void onClick(AjaxRequestTarget target) { 

     //actions to do when link is clicked 
    } 
    }); 
} 
} 

希望這有助於

+0

這不會失敗,因爲沒有標記與檢票:身份證「ID」,沒有在你的單元格的標記HREF標記? – Nicktar 2012-08-14 14:23:41

+0

我寫的代碼確實有錯誤。我編輯了我的答案,以便代碼正常工作(我在AjaxFallbackDefaultDataTable中測試了它,它正在工作)。但是,正如我在答覆中所說的那樣,我不建議這樣做,因爲您將標記添加到鏈接時遇到問題。 @Nicktar感謝您指出:) – jrochette 2012-08-14 14:44:29

+0

如果我嘗試它,它會工作,但在表中的單元格中,它顯示'[cell]'字符串,而不是模型的值。我怎麼能得到模型的值而不是'[cell]',就像我添加新的'Link'項目一樣? – victorio 2013-12-06 12:52:53

0

交易只是一個模型類。這是一個例子,沒有任何Wicket提供。這同樣適用於LinkPanel類。它是模型的內部類,擴展了Wickel Panel類。需要Panel類來爲鏈接提供標記。

另一種選擇是使用這樣的:

columns[0] = new TextFilteredPropertyColumn(new Model("Id"), "id", "id") { 
    // add the LinkPanel to the cell item 
    public void populateItem(Item cellItem, String componentId, IModel model) { 
     cellItem.add(new AjaxEventBehaviour("onclick") { 

      protected void onEvent(final AjaxRequestTarget target) { 
       // Put Link logic here 
      } 
     }); 

     // Populate your item here 
    } 
}; 

,使整個小區可點擊(但要求阿賈克斯)...