3

我使用 ClientBundle 和 CssResources 已经有一段时间了,但注意到我的样式被注入了很多次。我也可以指出的一件事是我使用了很多<ui:with field='resources' type='com.vf.client.resources.Resources' />在我的模板中,我怀疑这是在创建我的 clientBundle 的多个副本。甚至可能导致这种情况的一件事是,我使用了 Ray Ryan 将我的视图缓存在我的客户端工厂中的概念,因此某些视图是在附加到 DOM 之前创建的。在我的基本视图中,我在资源上使用提供的=true,以便希望不要让 UiBinder 为我生成一个新的。这可能不起作用,我怀疑并且 ui:with 正在创建一个新副本并忽略提供的=true。我在 Chrome 和 Firebug 中使用了开发人员工具来查看,在这两种情况下,样式都被注入了很多次。不知道如何在不从我的所有 UiBinder 模板中删除我的 Resources 类的情况下解决这个问题,这会做很多工作。任何想法表示赞赏。

/**
 * 
 * @author chris
 */
public abstract class ViewImpl extends Composite implements IView, RequiresResize {

    @UiField(provided = true)
    public final Resources resources;

}




public interface Resources extends ClientBundle, CellTable.Resources, CellList.Resources, DataGrid.Resources {

    /**
     * These are the obfuscated styles.
     * 
     * @return
     */
    @Source({ "default.css", "default-external.css"})
    public Style style();
}

更新

我一直在使用工厂/单例,只是为了确保它只创建一个。当应用程序启动时,我在我的 ClientFactory 实现中创建了这个 Resources ClientBundle。在我的应用程序开始时,我在我的风格上调用 ensureEnjected,从那时起,我的代码中永远不会调用 ensureInjected。

这是我的工厂,它只是获取我的单身请求工厂。我曾经在我的界面中使用静态初始化程序,但不久前我搬到了这里,希望能解决我的多种样式问题。

import com.google.gwt.core.client.GWT;

public class ResourcesFactory {

    private static Resources instance = null;

    private ResourcesFactory() {
    }

    public static final Resources getResources() {
        if (instance == null) {
            instance = GWT.create(Resources.class);
        }

        return instance;
    }
}

我的客户端包仅在此处初始化和注入。

  @Override
    public void onModuleLoad() {
        if (Window.Location.getParameterMap().containsKey("debug")) {
            Window.alert("Remote Debugging will be enabled, see server log for debug information");
            RemoteDebugService.enable();    
        }

        try {
            clientFactory = ClientFactory.INSTANCE;
            masterLayoutPanel = clientFactory.getMasterLayoutPanel();
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Unable to instantiate the ClientFactory", e);
            Window.alert("SOMEBODY BROKE THE BUILD, add ?debug to the url to enable remote debugging" + e.getMessage());
        }

        RootLayoutPanel.get().add(masterLayoutPanel);
        StyleInjector.inject(clientFactory.getResources().style().getText());

        PlaceHistoryHandler historyHandler = new PlaceHistoryHandler(clientFactory.getPlaceHistoryMapper());
        PlaceController placeController = clientFactory.getPlaceController();

        // Start PlaceHistoryHandler with our PlaceHistoryMapper
        historyHandler.register(placeController, clientFactory.getEventBus(), defaultPlace);

        startApplication(clientFactory, historyHandler);
        }
4

2 回答 2

0

到目前为止,我至少发现了一个我做错的问题,这导致我的风格被多次注入。首先是我将 CellTable 和 Datagrid 样式定义在我的单个样式表中,但是在注入这种样式时,它会被多次注入。在下面的代码中,default.css 包含我对整个 Web 应用程序的所有 css 定义,包括单元格表和单元格网格样式。我在应用程序开始时注入了这些,当然 cellTableStyle() 和单元格 dataGridStyle() 注入了整个样式表。

public interface Resources extends ClientBundle, CellTable.Resources, CellList.Resources, DataGrid.Resources {

...

    /**
     * {@link CellTable.Style} styles
     */
    @Source("default.css")
    Style cellTableStyle();

    /**
     * {@link DataGrid.Style} styles
     */
    @Source("default.css")
    Style dataGridStyle();

    /**
     * These are the obfuscated styles.
     * 
     * @return
     */
    @Source({ "default.css", "default-external.css" })
    public Style style(); 
...


}

如果以这种方式声明样式,则样式表应分解为单独的样式表,并且仅包含相关样式或实现我的主要样式来实现这些接口并删除额外依赖的样式实现。

public interface Resources extends ClientBundle, CellTable.Resources, CellList.Resources, DataGrid.Resources {

...



    /**
     * {@link CellTable.Style} styles
     */
    @Source("celltable.css")
    Style cellTableStyle();

    /**
     * {@link DataGrid.Style} styles
     */
    @Source("datagrid.css")
    Style dataGridStyle();

    /**
     * These are the obfuscated styles.
     * 
     * @return
     */
    @Source({ "default.css", "default-external.css" })
    public Style style(); 
...


}

这是可以将样式传递给 CellTable 样式并且样式只会被注入一次的实现。请注意,该样式实现了所有需要的表格、网格和列表样式。

public interface Resources extends ClientBundle, CellTable.Resources, CellList.Resources, DataGrid.Resources {

...

 public interface Style extends CssResource, ProgressWidget.Style, CellTable.Style, CellList.Style, DataGrid.Style {
    ...

}


    /**
     * Single style that can be used for all my cell table resources 
     * and the default styles.
     * 
     * @return
     */
    @Source({ "default.css", "default-external.css" })
    public Style style(); 
...


}
于 2013-05-06T16:26:25.297 回答
0

多次注射到底是什么意思?

ClientBundle 基本上是 Singleton 的(请参阅此线程Will 从多个 UiBinders 中引用单个 ClientBundle 类会花费什么?)。
因此,您是否使用它甚至都没有关系provided=true

但是,如果您真的想避免使用 ClientBundle 代理,您可以使用Gin或 aFactory实例化(GWT.create或神奇地通过 @InjectClientBundle一次并将其注入您的Views,但我猜在编译的代码中它不会有太大的不同。

于 2013-04-19T09:09:35.923 回答