【问题标题】:Using Gin to Inject Multiple Views使用 Gin 注入多个视图
【发布时间】:2013-08-09 18:37:55
【问题描述】:

我正在尝试组合一个多项目应用程序,其中一个子项目具有针对单个演示者的多个视图。我正在使用 Gin 将视图注入我的演示者。

子项目包含演示者和 2 个不同的视图。我有 2 个单独的 gin 模块,每个模块将一个视图绑定到视图界面。

根据 Thomas Broyer 对this post 答案的建议,我的 Ginjector 被包装在一个“holder”类中,该类在特定的 ginjector 上调用 GWT.create。使用 replace-with 语句在 gwt.xml 文件中配置适当的持有者。

当我在开发模式下运行我的项目时,我看到备用视图按预期显示。但是,当我编译项目时,我仍然只能得到默认视图。此外,只有 6 个排列(由于替换逻辑,我期望更多),并且在不同的场景中我没有得到我期望的视图。

这里有一些代码来说明。

Subproject.gwt.xml 包含以下内容:

<replace-with class="com.example.GinjectorDesktopHolder">
    <when-type-is class="com.example.GinjectorHolder" />        
</replace-with>

<replace-with class="com.example.GinjectorTabletHolder">
    <when-type-is class="com.example.GinjectorHolder" />
    <when-property-is name="formfactor" value="tablet" />
</replace-with>

“formfactor”变量是在从 GWT 的 mobilewebapp sample project 逐字复制的 gwt.xml 中定义的。

Holder 类如下所示:

public abstract class GinjectorHolder {
    public abstract Ginjector getGinjector();
}


public class GinjectorTabletHolder extends GinjectorHolder {
    @Override
    public Ginjector getGinjector() {
        return GWT.create(GinjectorTablet.class);
    }   
}


public class GinjectorDesktopHolder extends GinjectorHolder {
    @Override
    public Ginjector getGinjector() {
        return GWT.create(GinjectorDesktop.class);
    }
}

我的 Ginjector 看起来像这样:

public interface MyGinjector {
    MyView getView();
    EventBus getEventBus();
}


@GinModules({ModuleDesktop.class})
public interface GinjectorDesktop extends Ginjector, MyGinjector {}


@GinModules({ModuleTablet.class})
public interface GinjectorTablet extends Ginjector, MyGinjector {}

我的模块如下所示:

public class ModuleDesktop extends AbstractGinModule {
    @Override
    protected void configure() {
        bind(MyPresenter.View.class).to(DesktopView.class);
    }
}


public class ModuleTablet extends AbstractGinModule {
    @Override
    protected void configure() {
        bind(MyPresenter.View.class).to(TabletView.class);
    }
}

最后,在我的演示者代理中,基本上是这个特定子项目的入口点,我有这行:

GinjectorHolder holder = GWT.create(GinjectorHolder.class);
MyGinjector ginjector = holder.getGinjector();      

如前所述,当我在开发模式下运行并放入断点时,我可以看到创建了相应的 GinjectorHolder。 FormFactor.gwt.xml(上面链接)提供了一个开关,用于使用 URL 参数切换到您想要查看的上下文。所以我可以在 URL 中执行 formfactor=tablet 并创建 Tablet Ginjector Holder。

【问题讨论】:

  • 您认为应该生成更多排列是正确的。我对 GIN 和 formfactor.js 文件使用了完全相同的配置,我通常得到 16 个 perms。您是否在 .gwt.xml 文件中配置了 user.agent 属性?
  • 嗨,克里斯 - 我已经调试到我知道我得到了正确的外形尺寸的水平,因为我能够在我的浏览器中定位和调试 GWT JS。我还在 Safari 中调试了该代码,调试了我的 ipad。所以我确信那部分是有效的。就像我提到的那样,在开发模式下运行时,我确实得到了不同的视图。我唯一能想到的是,我的 gin 模块可能没有在 2 个项目中正确配置。你这样做时是否使用了多个项目?
  • 不,我使用一个项目,你如何配置你的 gwt-maven-plugin 来编译两个独立的项目?其他一切看起来都正确,可能是 gwt 编译器在运行时没有看到第二个项目
  • 子项目只输出一个JAR文件。只有主项目进行 gwt 编译。现在,我有 2 个实际包含视图的子项目,以及一个包含一些共享代码的公共项目。这 3 个项目只输出一个带有源代码的 JAR。第 4 个项目包含我唯一的 EntryPoint 类。它运行得很好,GWT 编译器正确识别了我的代码拆分。在此更改之前,我对此没有任何问题。
  • 当您删除 &lt;collapse-property name="formfactor" values="*"/&gt; 行(来自 mobilewebapp 示例)时,它会编译更多排列吗?

标签: gwt gwt-gin


【解决方案1】:

如 cmets 中所述,删除该行

<collapse-property name="formfactor" values="*"/>

导致排列数量的预期增加。

仍然很神秘,为什么这是必要的,因为通常应该可以折叠您喜欢的任何属性 - 这只是意味着每个浏览器必须下载更多代码,但仍然应该得到它需要的一切。可能是一个错误。

【讨论】:

    【解决方案2】:

    首先,您可以将视图绑定到 viewprovider,而不是将视图映射到 viewimpl,然后根据用户代理值,您可以返回要绑定到的适当实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多