我使用 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);
}