Я использую ClientBundle и CssResources в течение довольно длительного времени, но заметил, что мои стили вводятся много раз. Единственное, что я могу указать на мой палец, это то, что я использую довольно много <ui:with field='resources' type='com.vf.client.resources.Resources' />
в своих шаблонах, и мое подозрение в том, что это создание нескольких копий моего clientBundle. Одна вещь, которая может даже привести к этому, заключается в том, что я использую концепцию Ray Ryan о кешировании моих представлений в моей clientfactory, поэтому некоторые из представлений создаются до того, как они будут прикреплены к DOM. В моем базовом представлении я использую предоставленный = true для ресурсов, чтобы, надеюсь, не позволить UiBinder генерировать новый для меня. Возможно, это не работает, я подозреваю, и ui: with создает новую копию и игнорирует предоставленный = true. Я использовал инструменты разработчика в Chrome и Firebug, чтобы увидеть, и в обоих случаях стиль вводится многократно. Не уверен, как решить эту проблему даже без удаления моего класса ресурсов из всех моих шаблонов UiBinder, и это потребует немалых усилий. Любые идеи приветствуются.GWT, CssStyle вводится несколько раз
/**
*
* @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();
}
Update
Я использовал заводскую/одноплодной просто чтобы убедиться, что он создает только один. Я создаю этот ресурс ClientBundle в моей реализации ClientFactory, когда приложение запускается. В моем запуске приложения я вызываю secureEnjected в моем стиле, и с этого момента на securityInjected никогда не вызывается в моем коде.
Это моя фабрика, которая просто получает мою фабрику запросов на один запрос. Раньше у меня был статический инициализатор внутри моего интерфейса, но я перешел на это некоторое время назад, надеюсь, очистит мою проблему с несколькими стилями.
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);
}