2013-03-28 45 views
0

我有一个应用程序2个视图和2个演示者。我有一个固定的顶部菜单,带有一个使用SuggestionBox的搜索框。我从数据库中得到建议列表,然后使用addAll(..)方法将它加载到SuggestionBox的MultiWordSuggestOracle中。GWT:SuggestionBox作为一个全局变量

我使用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

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

有不同的方法来解决你的问题,你可以使用多个ActivityManagers就像是在这个post解释,或者你可以在与菜单栏的UI固定部分出你的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); 
} 
+0

谢谢。这对我帮助很大。我添加了一个全局变量来第一次加载SuggestBox。 –