0

我有个问题。在大型 GWT(2.4)-app 中,我决定使用 gwt-code-splitting。GWT-compiller 为一个小的 js-parts 裁剪了应用程序。

但是,当我想加载一些模块时

final Module form = ModuleFactory.getInstance().getModule(modumesName);

/ * /

private Module module = null;

public Module getModule(String moduleName){
 if (moduleName.equals("M1")) {
 GWT.runAsync(new RunAsyncCallback() {      
        @Override
        public void onSuccess() {
            module = GWT.create(M1.class);
        }

        @Override
        public void onFailure(Throwable arg0) {
            Window.alert("not load M1");
        }
    });
  }
return module;
}

M1扩展模块

当我第一次调用创建小部件 M1 时,出现 js 错误

“未捕获的 com.google.gwt.event.shared.UmbrellaException:捕获到一个或多个异常,请参阅 UmbrellaException#getCauses 中的完整集”

但是,在其他时间,我得到了我的模块 M1。在我看到的开发工具中,加载了拆分部分。

public class CreateModuleWidget extends Composite{
     private static final Binder binder = GWT.create(Binder.class);
     interface Binder extends UiBinder<Widget, CreateModuleWidget> {}

     public CreateModuleWidget() {
           /*initparams**/ 
     }

     @UiHandler("createButt")
     void onCreateClick(ClickEvent event) {
          String modumesName = "M1";
          final WidgetDialog dialog = new WidgetDialog(moduleName, true);
          final Module form = ModuleFactory.getInstance().getModule(modumesName);
          dialog.setDialogWidget(form);
          dialog.show();
     }
}

public class ModuleFactory{
    private Module form = null;

private static ModuleFactory instance = null;

public static ModuleFactory getInstance(){
    if(instance == null){
        instance = new ModuleFactory();
    }
    return instance;
}
    public Module getModule(String moduleName){
        if (moduleName.equals("M1")) {
           GWT.runAsync(new RunAsyncCallback() {        
        @Override
        public void onSuccess() {
            module = GWT.create(M1.class);
        }

        @Override
        public void onFailure(Throwable arg0) {
            Window.alert("not load M1");
        }
    });
          }
    return module;
   }
 }

未捕获的 com.google.gwt.event.shared.UmbrellaException:捕获到一个或多个异常,请参阅 UmbrellaException#getCauses BDC16B1A93B4190A8C1DD66EEF9838B8.cache.html:1435 中的完整集(匿名函数)

4

2 回答 2

1

嗯,你知道,它被调用runAsync是有原因的:它是一个同步的。

于 2013-02-17T17:48:10.487 回答
0

通常我这样做是作为 MVC 的一部分。

控制器检查它需要的模块是否为空,如果是,则加载它,然后在获得所需代码后继续查看。

Module module;



   if (module==null){

          //You could display a waiting message in a dialog

          GWT.runAsync(new RunAsyncCallback() {  
           ...
            public void onSuccess() {
                  module = GWT.create(M1.class);
                  showXYZView();
             }
     });

    }else{
          showXYZView();
    }
于 2013-02-18T04:41:45.247 回答