Adrián González Rus
Software Crafter
BBVA Next Technologies
EmberJS Madrid Organizer
<input>
<video>
<audio>
<track>
<source>
<embed>
<web-component/>
#shadow-root
<div>Content</div>
class MyComponent extends HTMLElement {}
customElements.define('my-component', MyComponent);
<my-component/>
HTMLAudioElement
HTMLVideoElement
HTMLTrackElement
HTMLSourceElement
const shadowRoot = element.attachShadow({ mode: 'open' });
shadowRoot.innerHTML = '<span>This is my content!</span>';
const template = document.getElementById('my-template');
const templateContent = template.content;
shadowRoot.appendChild(templateContent);class MyComponent extends HTMLElement {
constructor() {
super();
const shadowRoot = element.attachShadow({ mode: 'open' });
const template = document.getElementById('my-template');
const templateContent = template.content;
shadowRoot.appendChild(templateContent);
}
}class MyComponent extends HTMLElement {
constructor() {}
connectedCallback() {}
disconnectedCallback() {}
attributeChangedCallback() {}
adoptedCallback() {}
}<!-- my-button.hbs -->
<style>
button {
background: #209cee;
color: white;
padding: 2rem 4rem;
border: 0;
font-size: 1.5rem;
}
</style>
<button>Esto es un botón</button>
{{my-button}}class MyComponent extends HTMLElement {
connectedCallback() {
const shadow = this.attachShadow({ mode: 'open' });
}
}class MyComponent extends HTMLElement {
connectedCallback() {
const shadow = this.attachShadow({ mode: 'open' });
const template = compileTemplate('{{my-component}}');
const component = renderTemplate(app, template);
}
}class MyComponent extends HTMLElement {
connectedCallback() {
const shadow = this.attachShadow({ mode: 'open' });
const template = compileTemplate('{{my-component}}');
const component = renderTemplate(app, template);
shadow.appendChild(component);
}
}<my-component>
Esto es un texto de contenido
</my-component>shadowRoot.innerHTML = '<slot></slot>';<my-component>
<span slot="header">Cabecera</span>
<span slot="body">Mensaje</span>
</my-component>shadowRoot.innerHTML = `
<slot name="header"></slot>
<slot name="body"></slot>
`;
<my-component title="Mi Component"/>const title = element.getAttribute('title');const title = element.getAttribute('title');
shadowRoot.innerHTML = `<span>${title}</span>`;{{my-component title='Mi componente'}}connectedCallback() {
// ...
const controller = Controller.create();
const component = renderTemplate(controller, template);
// ...
}connectedCallback() {
// ...
const controller = Controller.create();
const attrs = element.getAttributeNames().map(attr =>
`${attr}=${attr}`).join(' ');
const template = compileTemplate(
`{{${componentName} ${attrs}}}`);
const component = renderTemplate(controller, template);
// ...
}attributeChangedCallback() {
element.getAttributeNames().forEach(attr => {
const value = element.getAttribute(attr);
controller.set(attr, value);
});
}const event = new CustomEvent('onClick', {
detail: 'Se ha producido un click',
});
element.dispatchEvent(event);element.addEventListener('onClick', value => {
console.log(value)
});
Ember App
Ember Addon
Bundle.js
<script src="bundled.js"></script>
defineCustomElements({
'my-web-component': {
name: 'my-ember-component'
}
});