2011-09-08 60 views
1

我們正在Wicket中開發一個新應用程序,並遇到一個小問題。
在Wicket中更新數據表

我們做什麼:

1)創建一個新的SortableDataProvider
2)創建一個新的DefaultDataTablePagingInBottom
3)創建一個新的WebMarkupContainer
4)DefaultDataTablePagingInBottom添加到WebMarkupContainer
5)創建一個新的AjaxCheckBox
6)在AjaxCheckBox的onUpdate中,將WebMarkupContainer添加到AjaxRequestTarget中7)將SortableDataProvider設置爲新的SortableDataProvider(與更新的查詢)
8)DefaultDataTablePagingInBottom.replaceWith(新DefaultDataTablePagingInBottom - 與新的供應商)。

什麼happends:

1)點擊複選框 - >沒什麼happends。
2)再次單擊 - > crash:「最後一個原因:只能在已經添加到其父級的組件上調用此方法
WicketMessage:接口org.apache.wicket.behavior.IBehaviorListener的onRequest方法在[email protected]靶向於成分[[組件ID =複選框]]拋出異常」
3)在瀏覽器中點擊後面 - >我過濾與列表新的提供者。

任何想法?編輯--- 這是一些代碼。

1)在所述網頁中的構造:

model = new Model(projectPlannerService); 
provider = new SortableProjectDataProvider(model, (WebSession) getSession(), isChecked); 
table = new DefaultDataTablePagingInBottom("table", columns, provider, 50); 

listContainer = new WebMarkupContainer("wmc"); 

listContainer.add(table); 
add(listContainer.setOutputMarkupId(true)); 

/* 
* checkbox för filtrering 
*/ 
AjaxCheckBox checkBox = new AjaxCheckBox("checkBox", new Model()) { 

    @Override 
    protected void onUpdate(AjaxRequestTarget target) { 
     target.add(listContainer, "wmc"); 
     isChecked = !isChecked; 
     provider = new SortableProjectDataProvider(model, (WebSession) getSession(), isChecked); 
     updateTable(); 
    } 
}; 
add(checkBox); 

2)在updateTable():

table.replaceWith(new DefaultDataTablePagingInBottom("table", columns, provider, 50)); 

3)SortableProjectDataProvider:

// Constructor 
public SortableProjectDataProvider(IModel<?> model, WebSession webSession, boolean isChecked) { 
    this.model = model; 
    this.projectPlannerService = (ProjectPlannerService) model.getObject(); 
    this.webSession = webSession; 
    setSort("customer", SortOrder.ASCENDING); 
    System.out.println("ischecked:" + isChecked); 
    if(!isChecked) 
     list = ((ProjectPlannerService) model.getObject()).findAllProjects(); 
    else 
     list = ((ProjectPlannerService) model.getObject()).findAllActiveProjects(); 

    System.out.println("size: " + list.size()); 

    comparator = new ProjectComparator(); 
} 

public Iterator<Project> iterator(int first, int count) { 

    Collections.sort(list, comparator); 
    if (first > list.size()) { 
     first = 0; 
    } 
    if (first + count > list.size()) { 
     return list.subList(first, list.size()).iterator(); 
    } else { 
     return list.subList(first, first + count).iterator(); 
    } 
} 

public IModel<Project> model(Project object) { 
    return new DetachableProjectModel((Project) object); 
} 

public int size() { 
    return list.size(); 
} 


private class DetachableProjectModel extends LoadableDetachableModel { 

    private Long id; 
    @SpringBean 
    ProjectPlannerService projectPlannerService; 

    public DetachableProjectModel(Long id) { 
     Injector.get().inject(this); 
     if (id == null) { 
      throw new IllegalArgumentException(); 
     } 
     this.id = id; 
    } 

    public DetachableProjectModel(Project project) { 

     this(project.getPk()); 
     Injector.get().inject(this); 
    } 


    public int hashCode() { 
     return id.hashCode(); 
    } 


    public boolean equals(final Object obj) { 
     if (obj == this) { 
      return true; 
     } else if (obj == null) { 
      return false; 
     } else if (obj instanceof DetachableProjectModel) { 
      DetachableProjectModel other = (DetachableProjectModel) obj; 
      return other.id == this.id; 
     } 
     return false; 
    } 


    protected Object load() { 
     return ((ProjectPlannerService) model.getObject()).findProjectById(id); 
    } 
} 

}

檢票口:延長
-input檢票:ID = 「CHECKBOX」 類型= 「複選框」 - 顯示活性 - /輸入 -
-div檢票:ID = 「WMC」 -
-table檢票:ID = 「表」 - /表 -
-/div-
- /檢票:extend-

提前感謝!
/安德烈亞斯

+0

請張貼一些代碼 –

+0

沒有代碼的問題很難回答! –

回答

0

嘗試這種情況:

錯:target.add(listContainer 「WMC」);
Right:target.add(listContainer);

錯;表。replaceWith(new DefaultDataTablePagingInBottom(「table」,columns,provider,50));
Right:DefaultDataTablePagingInBottom tmp = new DefaultDataTablePagingInBottom(「table」,columns,provider,50);
table.replaceWith(tmp);
table = tmp;
(更換DefaultDataTablePagingInBottom但不是你的參考。)

//歐萊

1

通過與你正在你的生活困難更換一個新的SortableProjectDataProvider的實例。而不是在構造函數中使用boolean isChecked,您可以使用IModel<Boolean>。將該模型的相同實例分配給您的數據提供者和複選框,然後完成。無需在onUpdate替代任何東西,添加listContainerAjaxRequestTarget,一切都應該只是工作...

例如

... 

private IModel<Boolean> isCheckedModel = new Model<Boolean>(Boolean.FALSE); 

... 

provider = new SortableProjectDataProvider(model, (WebSession) getSession(), isCheckedModel); 

... 

AjaxCheckBox checkBox = new AjaxCheckBox("checkBox", isCheckedModel) { 

    @Override 
    protected void onUpdate(AjaxRequestTarget target) { 
     target.add(listContainer); 
    } 
}; 

... 

在Wicket中用新的替換這些東西幾乎不是一個好主意。封裝模型中的更改並更改/替換模型的對象。每個具有對該模型的引用的對象都可以看到更新後的值或根據需要進行更改。

希望這會有所幫助。