我理解它的方式,如果我想动态地将小部件添加到使用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);
}
有效。但是,当使用后退按钮导航到上一个位置并返回时,将再次添加小部件。
如何正确处理?
答案 0 :(得分:2)
您有两种选择:
如果您不想在每次访问此视图时刷新数据,则需要在视图中添加一个标志,以告知数据是否已填充。然后,再次访问此视图时,仅当标志设置为false时,您的活动才应调用if (document.getElementById("SubmitButton").value == "GO TO CART") {
$("#SubmitButton").click(function() {
window.location.href = "Cart.html"
});
}
。加载数据后,将标志设置为true。
如果您确实要在每次访问时刷新数据,请在添加新的CellList之前调用view.passData(deps);
。
注意:更好的方法是在第一次显示视图时创建一次CellList,然后在新数据可用时调用departmentsDiv.clear()
。
答案 1 :(得分:1)
您正在使用Factory方法创建View对象。您应该考虑在应用程序加载期间创建视图,例如:GIN并将它们标记为单例。正确的方法是将它们作为start()
方法参数传递,并在它们上面设置presenter引用。
一般的想法是让观看单身人士。应该在抛出GWT位置(无状态)时创建活动,只使用单例视图,这样就可以保留视图输入数据。
在此阅读有关使用MVP / GIN模式的教程:http://blog.hivedevelopment.co.uk/2009/08/google-web-toolkit-gwt-mvp-example.html