GWT:SuggestionBox作为全局变量

时间:2013-03-28 19:17:15

标签: java gwt suggestbox

我有2个视图和2个演示者的应用程序。我有一个固定的顶级菜单,其中包含一个使用SuggestionBox的搜索框。我从数据库中获取建议列表,并使用addAll(..)方法将其加载到SuggestionBox的MultiWordSuggestOracle中。

我正在使用UiBinder,这是我的代码:

@UiField (provided=true) SuggestBox searchEntriesSuggestBox;
MultiWordSuggestOracle oracle; 

public MenuBar() {

  oracle = new MultiWordSuggestOracle();
  searchEntriesSuggestBox = new SuggestBox(oracle);
  initWidget(uiBinder.createAndBindUi(this));
}

public void loadUserEntries(Collection<String> entries){
  oracle.clear();
  oracle.addAll(entries);
}

我第一次运行应用程序时,使用loadUserEntries()加载建议。问题是当我更改我的View(和Presenter)时,因为SuggestBox加载了一个空的MultiWordSuggestOracle,所以每次我更改我的Presenter时我都要再次加载这些建议。

我想在应用程序的生命周期中将建议(MultiWordSuggestOracle)保留为全局变量,以避免使用loadUserEntries方法。

我尝试定义一个全局变量MultiWordSuggestOracle,每次我必须加载Presenter时,使用我的全局MultiWordSuggestOracle创建一个新的SuggestBox。但它没有用。

有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:1)

问题是每个视图都使用自己的MenuBar实例,因为每个视图都创建自己的实例。

有多种方法可以解决您的问题,您可以使用多个ActivityManagers,就像在此post中解释的那样,或者您可以在UI中使用MenuBar从MVP中获得固定部分显示,或简单的解决方案是使用静态变量并使load方法静态(只调用此方法一次)。

 @UiField (provided=true) SuggestBox searchEntriesSuggestBox;
 static MultiWordSuggestOracle oracle = null; 

 public MenuBar() {
   if (oracle == null) {
     oracle = new MultiWordSuggestOracle();
   }
   searchEntriesSuggestBox = new SuggestBox(oracle);
   initWidget(uiBinder.createAndBindUi(this));
 }

 public static void loadUserEntries(Collection<String> entries){
   oracle.clear();
   oracle.addAll(entries);
 }