2010-03-09 12 views
17

Bir CSSResource içine birkaç stilleri yarattı ve benGWT warrantyInjected()?

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

kullanıp iyi olup olmadığını çalışır.

Şunlara ışık tutabilir ve ne zaman kullanılmalı?

Teşekkür ederiz! Daniel

cevap

6

İyi bir soru - aklıma gelen bir durum, bir UiBinder şablonunda bazı genel stillerden stilleri kullanmak istediğinizde, o zaman ensureInjected'u aramanız gerekir. onlara referans veriyoruz (xml'de tanımladığınız "yerel" UiBinder stilleri otomatik olarak enjekte ediliyor).

Bu Mail example olduğu gibi kullanılan görebilirsiniz: ensureInjected UI bağlayıcı önce denir nasıl

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 
} 

Not.

Bu, ensureInjected kullanarak garanti veren tek durumdur, ancak belki bir şey özledim.

+0

Evet, bunu da anladım ama: global bir css dosyası kullanıyorum ve useInjected kullanıp kullanmadığımı iyi çalışıyor. Çözmeyi denediğim gizem bu. – user198313

1

UIBinder'ı kullanırsanız, useInjected öğesini ui: with etiketiyle sağlayın. Bir istemci paketinde (örn. Eski css hariç) kullandığınız ve bir ui'de bildirilmemiş olan diğer bir css için: block ile birlikte, eminInjected'i açıkça çağırmanız gerekir. Tabii bu varsayarak

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

:

UiBinder ui.xml dosya ensureInjected() çağırma hakkında endişelenmenize gerek yok iç
+2

Sadece UiBinder kullanıyorum, ama bana göre, sağlanmadı ... Açıkça söylemek zorunda kaldım. – buc

+0

Siz haklısınız, yorumumu daha net yaptım. –

8

Hıristiyan söylediği gibi, aşağıdaki XML ifadeleri işi

public interface MyStyle { 
    public String redBorder(); 
} 

Şimdi w kabul ediyorum: tanımlanmış bir MyStyle arayüzü yerde var UIBinder şablonlarının dışındaki uzantısını değiştirmeye ihtiyaç duyduğunuzda rahatsız edici şeyler alın. Tam olarak, 'u, widget'larınızla birlikte MyStyle örneğini kullanmadan önce çağırmak zorunda olduğunuz için.

Şahsen ben yolu ensureInjected() enjekte önce CssResource çağrıda sağlamakla özel CİN sağlayıcı uygulayabilirsiniz them.That ihtiyacınız olduğunda CssResource uzantılarının örneklerini enjekte etmek CİN kullanın. orada katılan üç adım vardır:

  • bir CSS dosyası ile birlikte MyStyle için bir arayüz oluşturun.
    MyStyle.java

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

    .redBorder { border: 1px solid red; } 
    
  • css bir ClientBundle uzantısı aracılığıyla Açığa.
    Resources.java

    public interface Resources extends ClientBundle { 
        @Source("MyStyle.css") 
        public MyStyle style(); 
    } 
    
  • yapılandır bir CİN sağlayıcı yöntemi MyStyle örneklerine enjekte etmek.
    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; 
        } 
    } 
    

Biz sorunsuz yerde GWT.<Resources>create(Resources.class) çağırarak statik Erişimcinin artık güçlük anlamına gelen burada yukarıda Resources örneğini enjekte, sadece tüm CİN enjeksiyon yoluyla gerçekleşir.

Bunu yaptıktan sonra, ihtiyacınız olduğunda MyStyle örneklerinizi enjekte edebilirsiniz. (Bazı MVP bağlamında) Örneğin
:

private Widget widget; 

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

'createStyle()' üzerinde '@ Inject' ekine gerçekten ihtiyacınız var mı? –

+0

ClientMOdule.java, 'Style' yerine 'MyStyle 'ifadesini kullanıyor mu? –

6

kural basittir: CssResource (a UiBinder şablonunda bir <ui:style> mı üretildi sürece, açıkça ensureInjected() aramak zorunda çoğu zaman çünkü oluşturulan CssResource üzerindeki kolu olmayacaktır.
Özellikle, <ui:with>CssResource s için özel bir tedavi sağlar . Ayrıca

, birkaç widget & yapıcısına argüman olarak belirli ClientBundle almak (örneğin CellTable), kullanacakları CssResource numaralı telefondan ensureInjected()'u arayacaklar.

+0

"ui: with" ile biraz daha spesifik olabilir misiniz? EminInjected() bunun için çağrılmalı mı yoksa yapılmalı mı? –

+0

"ui: with", "CssResource" ile ilgili özel bir şey yapmadığı için, evet, açıkça, emin olmak için, 'warrantyInjected() '_manually_' demek zorundasınız demektir. –

+0

, CssResource'ın uiBinder'dan çağrıldığında otomatik olarak dahil edilmesini sağlayan bir yol var mı? –