क्या जीडब्ल्यूटी नोड में अटैच इवेंट को संभालने का कोई तरीका है? मुझे लगता है कि मैं ऐसा कर सकता था:

Node myDiv = DOM.createDiv();
Magic.setOnAttachEventListener(myDiv, new EventListener() {
  @Override
  public void onEvent(Event event) {
    // ...
  }
}

जब मैं ऐसा कुछ करता हूं तो हैंडलर को बुलाया जाना चाहिए,

parent.appendChild(myDiv);

यह देखते हुए कि parent स्वयं संलग्न है, अर्थात, यह वर्तमान विंडो में प्रदर्शित होता है।

0
Alexey Berezkin 15 जुलाई 2016, 22:09

4 जवाब

सबसे बढ़िया उत्तर

मैं अपना दूसरा उत्तर पोस्ट करता हूं क्योंकि अब मुझे पता है कि आप माता-पिता में डीआईवी कैसे जोड़े जाते हैं, इसे बदल नहीं सकते हैं।

कुछ खोज के बाद मुझे म्यूटेशन इवेंट मिले। वे आपको DOMNodeInserted ईवेंट सुनने की अनुमति देते हैं:

जेएस:

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

जीडब्ल्यूटी में आपको जेएसएनआई विधि का उपयोग करने की आवश्यकता है:

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

यह काम करता है, लेकिन ... इसे बहिष्कृत किया गया है। आपको इसके बजाय MutationObserver का उपयोग करना चाहिए।

दुर्भाग्य से MutationObserver में NodeInserted घटना नहीं देखी जा सकती है। मैंने सोचा था कि subtree म्यूटेशन ऑब्जर्वेशन काम करेगा लेकिन यह मेरे काम नहीं आया। समाधान माता-पिता पर childList उत्परिवर्तन का निरीक्षण करना है:

जेएस:

// 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);

और, फिर से, जीडब्ल्यूटी के लिए आपको इसे जेएसएनआई विधि में लपेटना होगा (आप जानते हैं कि कैसे)।

ऑब्जर्वर कॉलबैक में mutation पैरामीटर एक MutationRecord है। वस्तु।

इसलिए, यदि आप माता-पिता को प्राप्त कर सकते हैं, तो उस पर MutationObserver का उपयोग करें और childList उत्परिवर्तन का निरीक्षण करें। यदि नहीं, तो बहिष्कृत उत्परिवर्तन घटनाओं का उपयोग करने का प्रयास करें।


मुझे पता है कि यह शुद्ध जीडब्ल्यूटी समाधान नहीं है, लेकिन आप घटना या उत्परिवर्तन को संभालने के लिए जीडब्ल्यूटी विधियों का उपयोग कर सकते हैं। आपको बस जीडब्ल्यूटी विधि फॉर्म जेएसएनआई को इस तरह कॉल करने की आवश्यकता है:

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

आपको JSNI की सभी जानकारी GWT प्रलेखन में मिलेगी।

2
Adam 17 जुलाई 2016, 00:16

GWT के सभी Widget पहले से ही HasAttachHandlers इंटरफ़ेस। यदि आपको इस कार्यक्षमता की आवश्यकता है, तो आप नोड के बजाय विजेट का उपयोग करना बेहतर समझ सकते हैं।

1
Andrei Volgin 16 जुलाई 2016, 04:40

आप SimplePanel या HTMLPanel का उपयोग कर सकते हैं क्योंकि दोनों ही इसकी सामग्री के लिए DIV का उपयोग करते हैं।

पैनल्स पर आप addAttachHandler मेथड को कॉल कर सकते हैं।

यदि आपको Element की आवश्यकता है तो आप पैनल पर getElement() विधि को कॉल कर सकते हैं।

यह विधि केवल तभी काम करती है जब आप myDiv को पैनल के रूप में संलग्न करते हैं, इसलिए इसके बजाय

parent.appendChild(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
Adam 16 जुलाई 2016, 00:32

"मतदान" विकल्प भी है जो बहुत प्रभावी नहीं हो सकता है लेकिन आसान हो सकता है, देखें https://stackoverflow.com/a/850995/938899 .

0
Community 23 मई 2017, 15:08