Подтвердить что ты не робот

Когда использовать GWT обеспечитьInjected()?

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

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

или нет.

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

Спасибо! Daniel

4b9b3361

Ответ 1

Как сказал Кристиан, внутри файла 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());
}

Ответ 2

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

Вы можете видеть, что это используется как таковое в Пример почты:

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, но, возможно, я что-то пропустил.

Ответ 3

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

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

Ответ 4

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