2016-07-15 1 views
0

GWTノードでonAttachイベントのソートを処理する方法はありますか?私はこのように行うことができたとしますGWTノードまたはエレメントがonAttachイベントをlistenする

Node myDiv = DOM.createDiv(); 
Magic.setOnAttachEventListener(myDiv, new EventListener() { 
    @Override 
    public void onEvent(Event event) { 
    // ... 
    } 
} 
私はこのような何かをしたときにハンドラが呼び出されるべき

parent.appendChild(myDiv); 

すなわち、それは現在に表示され、parent自体が装着されていることを考えます窓。

答えて

2

私は二番目の答えを投稿しています。私は、DIVがどのように親に追加されるかを変更できないことを知っています。

検索の結果、Mutation eventsが見つかりました。

JS:あなたはJSNIメソッドを使用する必要がGWTでは

myDiv.addEventListener("DOMNodeInserted", function (ev) { 
    alert('added'); 
}, false); 

:彼らはあなたがDOMNodeInsertedイベントを聞くことができるよう

private native void addListener(Element elem) /*-{ 
    elem.addEventListener("DOMNodeInserted", function (ev) { 
     $wnd.alert('added'); 
    }, false); 
}-*/; 

それは動作しますが、...それは廃止予定です。代わりにMutationObserverを使用してください。

残念ながらMutationObserverには、NodeInsertedイベントを監視しません。私はsubtree突然変異の観察は仕事をするだろうと思ったが、それは私のために働かなかった。 GWTのために、あなたは(あなたがどのように知っている)JSNIメソッドでそれをラップする必要があり、再び

// create an observer instance 
var observer = new MutationObserver(function(mutations) { 
    mutations.forEach(function(mutation) { 
     alert(mutation.type); 
    });  
}); 

// configuration of the observer: 
var config = { 
    childList: true 
}; 

// pass in the target node, as well as the observer options 
observer.observe(elem, config); 

そして、:

JS:ソリューションはchildList親の変異を観察することです。

オブザーバコールバックのパラメータmutationMutationRecordオブジェクトです。

親を得ることができる場合は、MutationObserverを使用してchildListの突然変異を観察します。そうでない場合は、廃止予定のMutationイベントを使用してみてください。


私は、これは純粋なGWTのソリューションではないことを知っていますが、イベントや変異を処理するためにGWTのメソッドを使用することができます。あなたはこのようGWT方法フォームJSNIを呼び出す必要があります:

[instance-expr.]@class-name::method-name(param-signature)(arguments) 

あなたはGWT documentation内のすべてのJSNIの情報を見つけることができます。

0

SimplePanelまたはHTMLPanelは、両方の用途としてDIVとして使用できます。

パネル上では、​​メソッドを呼び出すことができます。

Elementが必要な場合は、パネル上でgetElement()メソッドを呼び出すことができます。

この方法は、あなたがパネルとして、その代わりに

parent.appendChild(myDiv); 

myDivを添付する場合にのみ、あなたはここでは、この

HTMLPanel.wrap(parent).add(myDiv); 

を行う必要が働くにはサンプルコードです:

Element parent = RootPanel.getBodyElement(); 
    SimplePanel myDiv = new SimplePanel(); 

    // use it as Panel 
    myDiv.add(new Label("Hello!")); 

    // or use it as an element 
    myDiv.getElement().setInnerText("Hello 2!"); 

    myDiv.addAttachHandler(new Handler() { 
     @Override 
     public void onAttachOrDetach(AttachEvent event) { 
      Window.alert("Attached"); 
     } 
    }); 

// parent.appendChild(myDiv.getElement());  // this will not fire the AttachEvent 
    HTMLPanel.wrap(parent).add(myDiv);   // this will fire the AttachEvent 
+0

残念ながら、親が 'myDiv'を追加する方法を変更することはできません。もし私ができれば、何らかの方法で親に要素を追加した直後に、 "手で"それを処理します。 –

1

GWTのWidgetはすべて既にHasAttachHandlersのinterfを実装していますエース。この機能が必要な場合は、ノードの代わりにウィジェットを使用するほうがよいでしょう。

+0

残念ながら、私はいくつかのフレームワークの制約があり、ウィジェットに切り替えることができません。 –

+0

次に、ウィジェットがこのインターフェースを実装する方法を見てください。私が正しく覚えているのはそれほど簡単ではありません。 –

0

非常に効果的ではないかもしれないが容易であるかもしれない "ポーリング"の代替方法もあります。https://stackoverflow.com/a/850995/938899を参照してください。