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]> 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]> 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]> >> 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] >>> . >>> 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]. >> 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/CAN%3DyUA0uqKt2szck1hDAog2t9DjyKzi23c5-tiRJuAaiaPQcXw%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
