Hi, It works like a charm now! For the event.currentTarget, yes this is true, and I also pointed it in this thread earlier https://groups.google.com/forum/#!msg/google-web-toolkit-contributors/QrkNflMKe9E/cyhaHJGwtV8J . Actually good to know ES6 it won't work lambdas too, which should mean overriding "this" should fade out in some future.
Marcin On Friday, 22 May 2015 03:49:40 UTC+2, Goktug Gokdogan wrote: > > Ok, JsFunction call/apply issue should be fixed as of > https://gwt-review.googlesource.com/#/c/12810/. Can you verify that for > me? > > You cannot still access JQuery bound 'this'. However note that the same > issue also exists for ES6 arrow functions. > According to [1] this could be worked around in JQuery's case via > event.currentTarget. > > This required some restrictions and I put others as well so that one day > we can generate a completely real function from it. > > [1] > http://stackoverflow.com/questions/27670401/using-jquery-this-with-traceur-es6-harmony-arrow-functions-lexical-this-bi > > On Wed, Apr 29, 2015 at 2:19 PM, Goktug Gokdogan <[email protected] > <javascript:>> wrote: > >> I think this could be handled by @JsConvert that is specific for jQuery >> instead of a custom annotation. >> >> On Wed, Apr 29, 2015 at 1:02 AM, 'Ray Cromwell' via GWT Contributors < >> [email protected] <javascript:>> wrote: >> >>> >>> Lambda's are inner classes, so there is always a 'this' bound to the >>> generated instance, otherwise, the handling method wouldn't be invokable. >>> Imagine if you were implementing this with JSNI: >>> >>> class HandlerWithThisImpl implements HandlerWithThis { >>> public void onEvent(Element target, Event e) { ... } >>> } >>> >>> You'd have to write a wrapper that did this: >>> >>> static native JavaScriptObject makeFunction(HandlerWithThis impl) /*-{ >>> return function(e) { impl.@onEvent(*)(this, e); } >>> }-*/; >>> >>> But to make referential integrity work so that a HandlerWithThis passing >>> into JS and back into Java always converts to the same function and object >>> reference, you'd have to generate a lot more boilerplate. >>> >>> >>> Instead, to make @JsThis work efficiently, you'd have to do something >>> like this with the magic makeLambdaFunction >>> >>> /** >>> * Create a function that applies the specified samMethod on itself, and >>> whose __proto__ points to >>> * <code>instance</code>. >>> */ >>> public static native JavaScriptObject makeLambdaFunction(JavaScriptObject >>> samMethod, >>> JavaScriptObject instance, int jsThisArgPosition) /*-{ >>> var lambda = function() { >>> var args = arguments; >>> if (jsThisArgPosition >= 0) { >>> args.splice(jsThisArgPosition, 0, this); >>> } >>> return samMethod.apply(lambda, args); >>> } >>> lambda.__proto__ = instance; >>> return lambda; >>> }-*/; >>> >>> It's feasible, but I think the community needs to chime in. IIRC, the >>> DOM APIs have changed over the years to include the context as a field of >>> the event argument. >>> >>> But perhaps when you look at libraries like Ember, Angular, React, >>> Backbone, et al, all common is it for the 'this' to be bound, passing this >>> explicitly as a parameter? >>> >>> Typical Google coding style internally is if you want to use this, you >>> use Function.bind() to set it to what you want when you pass in a handler >>> function to something. >>> >>> Rebinding this from the calling context seems iffy and dangerous when >>> you think about Java code. >>> >>> >>> >>> >>> On Wed, Apr 29, 2015 at 12:32 AM, Marcin Okraszewski <[email protected] >>> <javascript:>> wrote: >>> >>>> >>>>>> 1. @JsFunction exported to JS doesn't have apply() and call() >>>>>> operations. Apply() is used by JQuery (2.1.3) to call callbacks, >>>>>> so basically it wasn't possible to add handlers using JQuery. See >>>>>> other >>>>>> thread on this: >>>>>> https://groups.google.com/forum/#!topic/google-web-toolkit/PHtfLTSAJDM >>>>>> >>>>>> >>>>>> Pretty interesting how to model that JQuery callback with JsInterop. >>>>> Basically when you do $("p").click(handler) then JQuery sets "this" for >>>>> the >>>>> handler to the element the event occurred on so you can do >>>>> >>>>> $("p").click(function() { >>>>> $(this).slideUp(); // slides the clicked p element up >>>>> }); >>>>> >>>>> I think you can't really do that with just JsInterop. I think your >>>>> Java callback must be JQueryCallback.exec(Element elem, Event e) and you >>>>> have to use JSNI to create a pure JS function that passes "this" as >>>>> "elem" >>>>> to the JQueryCallback. >>>>> >>>> >>>> >>>> This is definitely problematic. I didn't give it too much though, but I >>>> think it would be great if we could opt-in to get the *this* from >>>> JavaScript. Something like this: >>>> >>>> @JsFunction >>>> public interface HandlerWithThis { >>>> public void onEvent(*@JsThis* Element target, Event e); >>>> } >>>> >>>> If you need the JavaScript *this,* then you just add it as parameter >>>> to method with @JsThis annotation. As currently @JsFunction is not a >>>> JavaScript function, but an object that pretend the function, it should be >>>> possible to implement apply() and call() in such a way, that it passes >>>> this >>>> if there is a @JsThis parameter in the method signature. In case you don't >>>> need *this*, you just don't specify such parameter; in such case the >>>> method signature would be void onEvent(Event e). This would be much >>>> nicer then telling, you need to go to JSNI to do that. >>>> >>>> Do you think it could be done like this? >>>> >>>> Thanks, >>>> Marcin >>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "GWT Contributors" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to >>>> [email protected] >>>> <javascript:>. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/google-web-toolkit-contributors/97624985-35bf-48d6-b187-76181d9b8672%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/google-web-toolkit-contributors/97624985-35bf-48d6-b187-76181d9b8672%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "GWT Contributors" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected] >>> <javascript:>. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/google-web-toolkit-contributors/CAPVRV7e-HtaWNMSHWUQM8zkeGS1Ncz1hKaJiFr4_Occ4kArNFw%40mail.gmail.com >>> >>> <https://groups.google.com/d/msgid/google-web-toolkit-contributors/CAPVRV7e-HtaWNMSHWUQM8zkeGS1Ncz1hKaJiFr4_Occ4kArNFw%40mail.gmail.com?utm_medium=email&utm_source=footer> >>> . >>> >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> > -- You received this message because you are subscribed to the Google Groups "GWT Contributors" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/e9087c30-978d-466a-8606-8b9ecf21a4ab%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
