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.