我在實作這個章節所提及的方法時,遭遇了一點問題,因此提出來與大家分享。
在此說明一下我所遭遇的問題:
- 我寫了一個名為 Resources 的 interface,打算在其他的 template file 中使用,內容如下。
public interface Resources extends ClientBundle { @Source("Style.css") MyStyle style(); @Source("Logo.jpg") ImageResource logo(); public interface MyStyle extends CssResource { String red(); } }
- 當然 Style.css 與 Logo.jpg 都是存在的,並且 Sytle.css 中也定義了 .red。
- 然而當我使用如下的 template file 去使用 Resources 時,雖然 Image 能夠正常顯示,但是所有與 CssResource 相關的設定都沒有作用。
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' xmlns:g='urn:import:com.google.gwt.user.client.ui'> <ui:with field='res' type='com.my.app.widgets.logoname.Resources'/> <g:HTMLPanel> <g:Image resource='{res.logo}'/> <div class='{res.style.red}'> this text should be red </div> </g:HTMLPanel> </ui:UiBinder>
- 如果使用 Firebugs 等工具觀察, 會看到對應的 HTML 元素確實被指定了 CSS class,然而在 CSS file 內卻沒有對應的設定存在。
解決的方法為,建立一個 Resources 實體並呼叫 CssResource 的 ensureInjected() 方法,以確保 CssResource 有被加入 DOM 中。
Resources resources = GWT.create(Resources.class); resources.style().ensureInjected();
值得注意的是,無論創造了幾個 MyStyle 實體(包含在 Resources 內),也只需要執行一次 ensureInjected() 。所以合理的作法應該是在 EntryPoint 內呼叫 ensureInjected(),如果希望所有的頁面都能使用同一個 Resources 實體,可以將此處建立的物件傳給其他頁面,詳細作法參考同一篇文章中的 Share resource instances 章節(中譯: 共用 resource 的 instances)。
沒有留言:
張貼留言