Когда использовать GWT sureInjected ()? - PullRequest
17 голосов
/ 09 марта 2010

Я создал несколько стилей в CSSResource, и он хорошо работает, использую ли я

GWT.<MyResources>create(MyResources.class).myStyles().ensureInjected();

или нет.

Может ли кто-нибудь пролить свет на это и объяснить, когда использовать sureInjected или нет?

Спасибо! Daniel

Ответы [ 4 ]

8 голосов
/ 04 апреля 2011

Как сказал Кристиан, внутри файла UiBinder ui.xml вам не нужно беспокоиться о вызове ensureInjected(), следующие XML-операторы делают свою работу:

<ui:with field='myStyle' type='com...MyStyle'/>
<div class='{myStyle.redBorder}'/>

Конечно, предполагается, что где-то определен интерфейс MyStyle:

public interface MyStyle {
    public String redBorder();
}

Теперь я согласен с вами, что вещи раздражают, когда вам нужно манипулировать CssResource расширением вне шаблонов UiBinder. Именно потому, что вам нужно позаботиться о вызове ensureInjected() где-нибудь перед использованием экземпляра MyStyle с вашими виджетами.

Я лично использую GIN для внедрения экземпляров расширений CssResource всякий раз, когда они мне нужны. Таким образом, вы можете реализовать собственного поставщика GIN, обеспечивающего вызов ensureInjected() для CssResource перед его внедрением. Там есть три этапа:

  • Создайте интерфейс для MyStyle вместе с файлом CSS.
    MyStyle.java

    public interface MyStyle {
        public String redBorder();
    }
    
  • MyStyle.css

    .redBorder { border: 1px solid red; }
    
  • Экспонировать через расширение ClientBundle.
    Resources.java

    public interface Resources extends ClientBundle {
        @Source("MyStyle.css")
        public MyStyle style();
    }
    
  • Сконфигурируйте метод поставщика GIN для внедрения ваших экземпляров MyStyle.
    ClientModule.java

    public class ClientModule extends AbstractGinModule {
        @Override
        protected void configure() {
        //...
        }
    
        @Provides MyStyle createStyle(final Resources resources) {
            MyStyle style = resources.style();
            style.ensureInjected();
            return style;
        }
    }
    

Мы плавно внедряем экземпляр Resources, описанный выше, что означает, что больше нет хлопот статического метода доступа, вызывающего GWT.<Resources>create(Resources.class) где-либо, это просто происходит через внедрение GIN.

Сделав это, вы можете вводить свои экземпляры MyStyle, когда они вам нужны.
Например (в некотором контексте MVP):

private Widget widget;

@Inject
public SomeView(final MyStyle style) {
    //...
    widget = uiBinder.createAndBindUi(this);
    widget.addStyleName(style.redBorder());
}
6 голосов
/ 17 августа 2012

Правило простое: вы должны вызывать ensureInjected() явно, если только CssResource не генерируется из <ui:style> в шаблоне UiBinder (потому что большую часть времени у вас не будет дескриптора сгенерированного CssResource.
В частности, <ui:with> не предоставляет специальной обработки для CssResource с.

Кроме того, некоторые виджеты принимают конкретный ClientBundle в качестве аргумента для конструктора (например, CellTable), затем они вызывают ensureInjected() для CssResource, который они используют.

6 голосов
/ 09 марта 2010

Хороший вопрос - мне приходит в голову одна ситуация, когда вы хотите использовать стили из некоторой глобальной таблицы стилей в шаблоне UiBinder - тогда вам нужно вызвать ensureInjected, чтобы ... убедиться, что стили действительно введены, когда вы ссылаясь на них («локальные» стили UiBinder, которые вы определяете в xml, автоматически вводятся).

Вы можете использовать это как таковое в примере Mail :

public void onModuleLoad() {
    // Inject global styles.
    GWT.<GlobalResources>create(GlobalResources.class).css().ensureInjected();

    // Create the UI defined in Mail.ui.xml.
    DockLayoutPanel outer = binder.createAndBindUi(this);

    // ...rest of the code
}

Обратите внимание, как ensureInjected вызывается перед привязкой интерфейса.

Это единственная из известных мне ситуаций, в которой ордера используются ensureInjected, но, возможно, я что-то пропустил.

1 голос
/ 15 февраля 2011

Если вы используете UiBinder, то для вызоваInInject предоставляется тег ui: with. Для любого другого css, который вы используете в клиентском пакете (то есть устаревший css исключен), и который не объявлен в пользовательском интерфейсе: с блоком, вы должны явно вызывать sureInjected.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...