Toon posts:

custom Webcomponents + Angular

Pagina: 1
Acties:

Vraag


  • BasSpruit
  • Registratie: September 2002
  • Laatst online: 09-04-2022
Mijn vraag
Ik heb een webcomponent (geen angular component, maar een pure webcomponent, ook geen polymer) en die heb ik in mijn angular website gehangen. so far so good. het component wordt netjes getoont en reageert ook precies zoals ik verwacht. ik heb hiervoor (gedeeltelijk https://alligator.io/angular/using-custom-elements/) als voorbeeld voor gebruikt.

toen wilde ik gaan databinden... en daar loop ik nu op stuk. Mijn custom webcomponent gebruikt trouwens shadow-dom (geen idee of dat uitmaakt voor dit verhaal)

in mijn JS code (van mijn custom webcomponent) heb ik nu staan
code:
1
2
3
4
5
6
7
8
9
10
11
12
...
this.value = svgElement.innerHTML; 
//console.log(this.value) laat precies zien wat ik wil hebben overigens
this.dispatchEvent(new CustomEvent('valueChange', { bubbles: true, detail: +this.value }));
...

get value() {
 return this.getAttribute('value');
}
set value(newValue) {
 this.setAttribute('value', newValue);
}


Wat ik al gevonden of geprobeerd heb
als ik in mijn angular pagina het event 'valueChange' afvang, dan krijg ik alleen "{ "isTrusted": false }" te zien.
als ik 2way databinding probeer, dan krijg ik hetzelfde te zien.

Als ik hierop probeer te googlen, dan krijg ik alleen maar resultaten te zien over angular components, en die heb ik nu juist niet... (dit is best jammer)
hoe kan ik dit werkend krijgen?

Ik heb later op de avond een oplossing gevonden. Vind het niet helemaal mooi, maar hier is`tie dan toch:

code:
1
2
3
4
5
broadcast(e, value) {
        e.preventDefault();
        const event = new CustomEvent('valueChange', {detail: value, bubbles: true, composed: true});
        this.shadowRoot.dispatchEvent(event);
      }


en dan het event afvangen in angular

[Voor 12% gewijzigd door BasSpruit op 16-11-2018 22:07]

Alle reacties


  • q-enf0rcer.1
  • Registratie: Maart 2009
  • Laatst online: 23:00
Je zou wellicht doormiddel van https://angular.io/api/core/ViewChild via https://angular.io/api/core/ElementRef (nativeElement) de value van het custom component uit kunnen lezen vanuit de angular method. Dan hoef je zelf niet te werken met een doorgeefluik zoals nu :) Overigens, is de object referentie wel echt verloren zodra je een web component zijn value attribuut zet? Dat kan ik me namelijk niet zo goed voorstellen. Dus wellicht moet je gewoon de waarde die je doorzet naar het value attribuut, nogmaals loggen in angular. Een andere truc is om in plaats van de directe eindwaarde, het omliggende object door te geven en in een ander attribuut de property die je wilt gebruiken van het object. Op die manier zou je wellicht de object referentie intact kunnen houden.

  • BasSpruit
  • Registratie: September 2002
  • Laatst online: 09-04-2022
q-enf0rcer.1 schreef op zaterdag 17 november 2018 @ 11:22:
Je zou wellicht doormiddel van https://angular.io/api/core/ViewChild via https://angular.io/api/core/ElementRef (nativeElement) de value van het custom component uit kunnen lezen vanuit de angular method. Dan hoef je zelf niet te werken met een doorgeefluik zoals nu :) Overigens, is de object referentie wel echt verloren zodra je een web component zijn value attribuut zet? Dat kan ik me namelijk niet zo goed voorstellen. Dus wellicht moet je gewoon de waarde die je doorzet naar het value attribuut, nogmaals loggen in angular. Een andere truc is om in plaats van de directe eindwaarde, het omliggende object door te geven en in een ander attribuut de property die je wilt gebruiken van het object. Op die manier zou je wellicht de object referentie intact kunnen houden.
Dit heb ik net geprobeerd, en dan heeft de referentie naar mijn custom element niet het attribuut dat ik wil uitlezen (undefined volgens console log). Wat ik nu doe is het event afhandelen in code en daarvan de waarden uitlezen, dat werkt wel.

ik heb, op dit moment, geen idee van waarom het zo werkt. Maar het doet nu wel wat ik wil. :)

  • q-enf0rcer.1
  • Registratie: Maart 2009
  • Laatst online: 23:00
BasSpruit schreef op maandag 19 november 2018 @ 11:02:
[...]


Dit heb ik net geprobeerd, en dan heeft de referentie naar mijn custom element niet het attribuut dat ik wil uitlezen (undefined volgens console log). Wat ik nu doe is het event afhandelen in code en daarvan de waarden uitlezen, dat werkt wel.

ik heb, op dit moment, geen idee van waarom het zo werkt. Maar het doet nu wel wat ik wil. :)
Wellicht een bijwerking van shadow DOM. De CSS is volledig geïsoleerd, waarschijnlijk de JS ook?

Je oplossing is er in ieder geval één die ik ook snel had overwogen. Dus ik denk wel dat dit voor nu dan de beste oplossing is aangezien mijn voorgedragen oplossing niet werkt en ik hier verder geen andere mogelijkheden zie langskomen.


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee