2010-03-09 23 views
17

Tôi tạo ra một vài phong cách vào một CSSResource và nó hoạt động tốt cho dù tôi sử dụngKhi nào sử dụng GWT assuranceInjected()?

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

hay không.

Có ai có thể làm sáng tỏ điều này và giải thích khi nào nên sử dụng EnsureInjected hay không?

Cảm ơn bạn! Daniel

Trả lời

6

Câu hỏi hay - khi bạn muốn sử dụng kiểu từ một số biểu định kiểu toàn cục trong mẫu UiBinder - thì bạn cần gọi ensureInjected để ... đảm bảo kiểu được chèn khi bạn đang tham khảo chúng (kiểu "UiBinder" cục bộ, mà bạn định nghĩa trong xml được tự động tiêm).

Bạn có thể thấy điều này sử dụng như vậy trong 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 
} 

Lưu ý cách ensureInjected được gọi trước khi ràng buộc UI.

Đây là trường hợp duy nhất tôi biết rằng đảm bảo sử dụng ensureInjected, nhưng có thể tôi đã bỏ lỡ điều gì đó.

+0

Vâng, tôi cũng hiểu điều này nhưng: Tôi đang sử dụng tệp css toàn cầu và nó hoạt động tốt cho dù tôi có sử dụng secureInjected hay không. Đây là bí ẩn mà tôi đang cố giải quyết. – user198313

1

Nếu bạn sử dụng UiBinder, lệnh gọi đến secureInjected được cung cấp bởi thẻ ui: with. Đối với bất kỳ css nào khác mà bạn đang sử dụng trong một gói ứng dụng khách (ví dụ: css cũ bị loại trừ) và không được khai báo trong một ui: với khối, bạn phải gọi EnsureInjected một cách rõ ràng.

+2

Tôi đang sử dụng riêng UiBinder, nhưng đối với tôi, nó không được cung cấp ... Tôi phải gọi nó một cách rõ ràng. – buc

+0

@ buc bạn nói đúng, tôi đã làm cho bình luận của tôi rõ ràng hơn. –

8

Như Christian nói, bên file UiBinder ui.xml bạn không phải lo lắng về cách gọi ensureInjected(), những điều khoản XML sau thực hiện công việc:

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

Tất nhiên điều này là giả định rằng có một giao diện MyStyle được xác định:

public interface MyStyle { 
    public String redBorder(); 
} 

Bây giờ tôi đồng ý w Điều đó khiến bạn khó chịu khi cần thao tác mở rộng CssResourcebên ngoài mẫu UiBinder. Chính vì bạn phải chăm sóc gọi ensureInjected() ở đâu đó trước khi sử dụng phiên bản MyStyle với các tiện ích của bạn.

Cá nhân tôi sử dụng GIN để chèn các trường hợp mở rộng CssResource bất cứ khi nào tôi cần chúng.Đó là cách bạn có thể triển khai nhà cung cấp GIN tùy chỉnh đảm bảo rằng ensureInjected() được gọi trên CssResource trước khi tiêm. Có ba bước liên quan có:

  • Tạo một giao diện cho MyStyle cùng với một file CSS.
    MyStyle.java

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

    .redBorder { border: 1px solid red; } 
    
  • Expose nó thông qua một phần mở rộng ClientBundle.
    Resources.java

    public interface Resources extends ClientBundle { 
        @Source("MyStyle.css") 
        public MyStyle style(); 
    } 
    
  • Configure một phương pháp cung cấp GIN để tiêm trường hợp của bạn của 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; 
        } 
    } 
    

Chúng tôi suôn sẻ tiêm dụ Resources đây ở trên, có nghĩa là không gặp rắc rối nhiều hơn một accessor tĩnh gọi GWT.<Resources>create(Resources.class) bất cứ nơi nào, nó chỉ tất cả xảy ra thông qua việc tiêm GIN.

Sau khi hoàn tất, bạn có thể tiêm các phiên bản MyStyle khi cần.
Ví dụ (trong một số bối cảnh MVP):

private Widget widget; 

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

Bạn có thực sự cần chú thích '@ Inject' trên' createStyle() 'không? –

+0

Nếu ClientMOdule.java tham chiếu đến 'MyStyle' thay vì' Style'? –

6

Quy tắc là dễ dàng: bạn phải gọi ensureInjected() một cách rõ ràng, trừ khi CssResource đang được tạo ra từ một <ui:style> trong một mẫu UiBinder (vì hầu hết thời gian bạn sẽ không có một xử lý trên tạo CssResource.
cụ thể, <ui:with> không cung cấp điều trị đặc biệt cho CssResource s.

Ngoài ra, một vài widget mất một ClientBundle cụ thể như là đối số để một hàm (như CellTable), sau đó họ sẽ gọi số ensureInjected() trên số CssResource mà họ sử dụng.

+0

Bạn có thể cụ thể hơn một chút về 'ui: with'. Liệu EnsureInjected() phải được gọi cho điều đó hay không? –

+0

Vì 'ui: with' không có gì đặc biệt về' CssResource', có nghĩa là, vâng, bạn phải gọi 'EnsureInjected()' _manually_, một cách rõ ràng. –

+0

là có cách nào để có CssResource được tự động bao gồm khi nó được gọi là từ uiBinder? –

Các vấn đề liên quan