2013-02-13 48 views
0

我創建的延伸SimplePanel窗口小部件,並執行一些JSNI中的onLoad()方法:GWT部件與JSNI不附着尚未

public class AceEditor extends SimplePanel implements HasText { 

    private JavaScriptObject editor; 

    @Override 
    protected void onLoad() { 
    super.onLoad(); 
    editor = createEditor(getElement()); 
    } 

    private static native JavaScriptObject createEditor(Element element) /*-{ 
     return $wnd.ace.edit(element); 
    }-*/; 

    @Override 
    public native void setText(String value) /*-{ 
     [email protected]::editor.setValue(value); 
    }-*/; 

    @Override 
    public final native String getText() /*-{ 
     return [email protected]::editor.getValue(); 
    }-*/; 

} 

問題是,當我打電話setText首次,小部件是不附件尚未(onLoad尚未呼叫)。

我使用這個小工具和UiBinder

我可以用​​和檢查部件連接,但它似乎並沒有做正確的方式...

爲什麼小部件不附加任何更早的想法?

回答

2

你可以在構造函數中調用createEditor而不是onload嗎?

看起來你的代碼在加載頁面之前調用了setText。
現在如果是這樣的話,在構造函數中調用createEditor應該是正確的。

+0

它似乎工作,但我認爲,JS初始化必須在'onLoad'完成,而不是在構造函數中完成,因爲小部件的'div'沒有附加到DOM。 – 2013-02-13 21:29:29

+0

你說的是真實的,只要你的JS引用的是頁面加載之前不能訪問的DOM上的其他元素。但在你的情況下,它更像是一個ur對象的構造。換句話說,如果沒有編輯器本身,你的AceEditor的用處不大。同時你在onload之前調用了setText方法,所以這意味着其他一些對象已經需要你的AceEditor了。加載 – Rohit 2013-02-13 21:38:50

2

任何想法爲什麼小部件沒有連接得更快?

根據定義,它不應該被「連接」,直到你把它添加到一個已經連接父後(無論是RootPanel,或另一件事已經加入到RootPanel)。你有沒有這樣做,onLoad仍然不叫?

如果你的JS工具(在這種情況下爲ace)要求存在一個DOM節點,那麼你不需要等待onLoad做任何事情 - 就像你的Widget子類的構造函數完成一樣,你必須已經已經指定了一個元素。

如果您確實需要將此元素附加到文檔,然後才能對其執行操作,那麼當然,您需要等到onLoad被調用。