2013-04-18 3 views
3

Я использую 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); 
     } 

ответ

0

Я выяснил по крайней мере одну проблему, которую я делал неправильно до сих пор, что заставляло мой стиль вводить несколько раз. Во-первых, я определил стили CellTable и Datagrid в моей отдельной таблице стилей, но при введении этого стиля он вводится несколько раз. В приведенном ниже коде default.css содержит все мои определения css для всего веб-приложения, включая таблицы ячеек таблицы и стилей ячейки. Я вводил их при запуске приложения, конечно, cellTableStyle() и cellGridStyle() вводили всю таблицу стилей.

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(); 
... 


} 
0

Что значит точно с несколькими инъекциями?

ClientBundle - это в основном Singleton (см. Эту тему Will referring to a single ClientBundle class from multiple UiBinders cost anything?).
Так что даже не важно, используете ли вы provided=true или нет.

Но если вы действительно хотите, чтобы избежать даже ClientBundle прокси вы можете использовать Gin или Factory для создания экземпляра (GWT.create или магически через @Inject) в ClientBundle раз и ввести его в Views, но я предполагаю, что в скомпилированного кода он выиграл Не имеет большого значения.

Смежные вопросы