0

我理解它的方式是,如果我想将小部件动态添加到使用 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);

}

有用。但是,当使用后退按钮导航到上一个位置并返回时,会再次添加小部件。

我该如何正确处理?

4

2 回答 2

2

你有两个选择:

  1. 如果您不想在每次访问此视图时刷新数据,则需要在视图中添加一个标志以告知数据是否已被填充。然后,当再次访问此视图时,您的活动应view.passData(deps);仅在标志设置为 false 时调用。加载数据后,将该标志设置为 true。

  2. 如果您确实想在每次访问时刷新数据,请departmentsDiv.clear()在添加新 CellList 之前调用。

注意:更好的方法是在第一次显示视图时创建一次 CellList,然后仅setRowData在新数据可用时调用。

于 2016-02-24T10:36:21.930 回答
1

您正在使用 Factory 方法创建 View 对象。您应该考虑在应用程序加载期间创建视图,例如使用:GIN 并将它们标记为 Singletons。正确的方法是将它们作为start()方法参数传递,并在它们上设置演示者引用。

一般的想法是使 Views 单例。应在抛出 GWT 位置(无状态)并仅使用单例视图时创建活动,以便您可以保留视图输入数据。

在此处阅读有关使用 MVP / GIN 模式的教程:http: //blog.hivedevelopment.co.uk/2009/08/google-web-toolkit-gwt-mvp-example.html

于 2016-02-24T10:21:10.323 回答