2010-03-09 6 views
17

Я создал несколько стилей в CSSResource и он работает использовать хорошо ли яКогда использовать GWT для обеспеченияInjected()?

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

или нет.

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

Спасибо! Daniel

ответ

6

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

Вы можете увидеть это использовать как таковой в Mail example:

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 Обратите внимание, как вызывается до связывания UI.

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

+0

Да, я тоже это понял, но: Я использую глобальный файл css, и он хорошо работает, независимо от того, использую ли я makeInjected или нет. Это таинственность, которую я пытаюсь решить. – user198313

1

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

+2

Я использую UiBinder исключительно, но для меня он не предоставляется ... Я должен был его явно называть. – buc

+0

@ buc Вы правы, я сделал свой комментарий более ясным. –

8

Как сказал Кристиан, внутри файл 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 всякий раз, когда мне нужно them.That способ можно реализовать пользовательский поставщик GIN гарантируя, что ensureInjected() называется на CssResource перед впрыскиванием. Есть три шага, участвующих там:

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

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

    .redBorder { border: 1px solid red; } 
    
  • Expose его через 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, когда они вам понадобятся.
Например (в некоторых ПМК контексте):

private Widget widget; 

@Inject 
public SomeView(final MyStyle style) { 
    //... 
    widget = uiBinder.createAndBindUi(this); 
    widget.addStyleName(style.redBorder()); 
} 
+0

Вам действительно нужна аннотация '@ Inject' на' createStyle() '? –

+0

Должен ли ClientMOdule.java ссылаться на 'MyStyle' вместо' Style'? –

6

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

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

+0

Можете ли вы быть более конкретным на 'ui: with'. Должен ли быть вызван этот запрос invicted() для этого или нет? –

+0

Потому что 'ui: with' ничего особенного в отношении' CssResource', это означает, что да, вы должны явно вызвать 'sureInjected()' _manually_. –

+0

есть ли способ, чтобы CssResource включался автоматически при его вызове из uiBinder? –

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

  • Нет связанных вопросов^_^