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.

Reply via email to