Ok, Thanks! I'll try with web components. As a java programer I'v been 
trying to avoid digging too much in javascript but it's inevitable it seems 
:)

On Thursday, October 12, 2017 at 12:43:56 PM UTC+2, Thomas Broyer wrote:
>
> This is not how the DOM works I'm afraid. How would your proposed code 
> would translate to JS? (feel free to use ES2015 classes for clarity)
> (btw, I really do think Web Components would solve your issues, as I see 
> them)
>
> On Thursday, October 12, 2017 at 12:21:11 PM UTC+2, nikola wrote:
>>
>>
>> When I say "custom element" I mean:
>>
>>
>> *public class *CustomElement *implements *IsElement {
>>
>>
>>
>> *//    private HandlerManager handlerManager; ?     *List<String> 
>> *someUserObject*; 
>>
>> *//state object of CustomElement     *HTMLElement *root *= Js.*cast*
>> (DomGlobal.*document*.createElement(*"div"*));
>>
>>     @Override
>>     *public *HTMLElement asElement() {
>>         *return **root*;
>>     }
>>
>>     *public static void *test() {
>>         CustomElement customElement = *new *CustomElement();
>>         customElement.asElement().addEventListener(*"click"*, evt -> {
>>
>>              //evt.target is not CustomElement so we can't access e.g 
>> *someUserObject *
>>
>>
>> *           //We can map DOM events to custom events fired through 
>> HandlerManager with source field set to CustomElement (double work.. )     
>>     *});
>>     }
>>     
>> *// *}
>>
>>
>> Also when working with custom elements constructed as above *we need 
>> some discipline to remove objects both logically and from DOM (as you said 
>> we need to keep them in sync).. *
>>
>> *We are coming to something that looks like a Panel*
>>
>>
>> *class *Panel *implements *IsElement {
>>
>>     List<IsElement> *componentList*;
>>
>>     HTMLElement *root*;
>>
>>     @Override
>>     *public *HTMLElement asElement() {
>>         *return **root*;
>>     }
>>
>>     *public void *add(IsElement component) {
>>         
>>
>> *// add to componentList         // add to DOM     *}
>>
>>     *public void *remove(IsElement component) {
>>         
>>
>> *//remove from componentList         //remove from DOM     *}
>> }
>>
>>
>> So it would be good to have something like this :
>>
>>
>> *public abstract class *CustomElementComposite *extends *HTMLElement 
>> *implements 
>> *IsElement {
>>
>>     List<String> *someUserObject*;
>>
>>     *protected void *initComposite(HTMLElement element) {
>>         
>> *//If we could encapsulate element to become actually 
>> CustomElementComposite like Widget Composite     *}
>>
>>     @Override
>>     *public *HTMLElement asElement() {
>>         *return this*;
>>     }
>>
>>     *public static void *test() {
>>         CustomElementComposite element = *new *CustomElementComposite() 
>> {};
>>
>>         element.addEventListener(*"click"*, evt -> {
>>             
>> *// evt.target  is CustomElementComposite         *});
>>
>>         
>> *// we don't need any additional mapping for adding and removing         
>> *HTMLElement 
>> parent = Js.*cast*(DomGlobal.*document*.createElement(*"div"*));
>>         parent.appendChild(element);
>>         parent.removeChild(element);
>>     }
>> }
>>
>> This way we are adding events directly and there is no additional 
>> synchronization with DOM when adding and removing components.
>>
>> I must inspect but I'm not sure if Web Component can solve this (in the 
>> way widget's composite did).. I'd rather have web component as a option.
>>
>>
>>
>>
>> On Thursday, October 12, 2017 at 10:48:05 AM UTC+2, Thomas Broyer wrote:
>>>
>>>
>>>
>>> On Wednesday, October 11, 2017 at 4:12:14 PM UTC+2, nikola wrote:
>>>>
>>>>
>>>>   Users would expect to have events with source from where event was 
>>>> fired. That was source field in GWT events. In your implementation we will 
>>>> need to intercept DOM event and fire new event with source field of custom 
>>>> element. (e.g re-fire through EventHandler). This is kind of double work. 
>>>>
>>>>   Another thing that we need to care about is if add and then remove 
>>>> some custom element from DOM like 
>>>> *element.removeChild(customElement.asElement()) *we also need to 
>>>> remove reference to custom element to be garbage collected? Since only 
>>>> *asElement() *is removed from DOM not custom element object itself. If 
>>>> I'm right...
>>>>
>>>>   This is why it would be good if custom element can extends Element 
>>>> and wrap inner element like Widget Composite.
>>>>
>>>
>>> I'm really not clear about what you want to do, and what you actually 
>>> mean by "custom element".
>>> Do you mean Web Components? In this case, they'd have to extend 
>>> HTMLElement and, at least with elemental2-dom 1.0.0-beta-1, set the 
>>> connectedCallback, attachedCalback, etc. Encapsulation is then provided by 
>>> the shadow DOM.
>>> Or do you mean "kind of widgets, that just happen to map one-to-one with 
>>> a DOM element and its subtree"? In this case, you're indeed *wrapping* an 
>>> element, and that means you're going to have parallel hierarchies or such 
>>> widgets/components on one hand, and DOM elements on the other hand, and 
>>> will need to maintain both in sync (this is what GWT Widgets do, and I 
>>> believe more or less how React works too).
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups "GWT 
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/d/optout.

Reply via email to