[英]GWT Activities: Widget added to view again when using browser back button
以我的理解,如果我想動態地將小部件添加到使用UIBinder創建的視圖中,則可以在該視圖的演示者的活動的start方法中進行操作。
這是我的代碼:
@Override
public void start(AcceptsOneWidget panel, EventBus eventBus) {
view = clientFactory.getDashboardView();
view.setPresenter(this);
ArrayList<Department> deps = ModelFactory.getDepartments();
view.passData(deps); // Correct?
panel.setWidget(view.asWidget());
}
public void passData(ArrayList<Department> departments) {
TextCell text = new TextCell();
CellList<String> cellList = new CellList<String>(text);
String[] departmentNames = new String[departments.size()];
for (int i = 0; i < departments.size(); i++) {
departmentNames[i] = departments.get(i).getName();
}
cellList.setRowData(Arrays.asList(departmentNames));
departmentsDiv.add(cellList);
}
有用。 但是,當使用“后退”按鈕導航到上一個位置並返回時,將再次添加該小部件。
如何正確處理?
您有兩種選擇:
如果您不想在每次訪問此視圖時刷新數據,則需要在該視圖中添加一個標志,以告知數據是否已被填充。 然后,當再次訪問該視圖時,您的活動應調用view.passData(deps);
僅當標志設置為false時。 加載數據后,將標志設置為true。
如果您確實想在每次訪問時刷新數據,請在添加新的CellList之前先調用departmentsDiv.clear()
。
注意:更好的方法是在第一次顯示視圖時一次創建CellList,然后在新數據可用時僅調用setRowData
。
您正在使用Factory方法創建View對象。 您應該考慮在應用程序加載期間創建視圖,例如使用:GIN並將其標記為Singletons。 正確的方法是將它們作為start()
方法參數傳遞,並僅在其上設置演示者引用。
總體思路是使Views單身。 應該在扔GWT場所(無狀態)的同時僅使用Singleton Views創建活動,以便可以保留視圖輸入數據。
在此處閱讀有關使用MVP / GIN模式的教程: http : //blog.hivedevelopment.co.uk/2009/08/google-web-toolkit-gwt-mvp-example.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.