I am trying to split a Polymer 3 component into separated files so for example:
import { html, PolymerElement } from '@polymer/polymer/polymer-element';
export default class TestSplit extends PolymerElement {
static get template() {
return html`
<style>
p {
color: blue;
}
</style>
<p>Hello from component</p>
`;
}
}
customElements.define('test-split', TestSplit);
would look like something like:
index.js:
import { PolymerElement, html } from '@polymer/polymer/polymer-element';
import css from './style.css';
import template from './template.html';
export default class TestSplit extends PolymerElement {
static get template() {
return html`
<style>${css}</style>
${template}
`;
}
}
customElements.define('test-split', TestSplit);
style.css:
p {
color: blue;
}
template.html:
<p>Hello from component</p>
Edit1:
I tried out the following code with the same template.html and style.css files:
import-test.js:
import { html, PolymerElement } from '@polymer/polymer/polymer-element';
import CssHtmlLoader from './cssHtmlLoader';
export default class ImportTest extends PolymerElement {
static get template() {
let htmlTemplate = CssHtmlLoader.prototype.getHtmlTemplate('template.html');
console.log(htmlTemplate)
return htmlTemplate.then(function (file) {
return html`
<link rel="stylesheet" href="style.css">
${file}
`;
});
}
}
}
customElements.define('import-test', ImportTest);
I am getting the right file from the promise:
But I also get the following errors:
Is there any idea what is wrong with the code?
I think, the way you want to import the css and html file, isn't possible. They are simple css/html files. They don't provide any module to export these files.
Only exported javascript modules can be imported.
I don't think there is any way to import a css file in js:
import css from './style.css'; // css can't be imported this way.
Instead You can make a service for getting you these files:
------------------------------------------------------------Working copy------------------------------------------------------------------
export class TemplateService {
xhrCall(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.onload = () => resolve(xhr.responseText);
xhr.onerror = () => reject(xhr.statusText);
xhr.send();
});
}
// As of now css is not dynamically included
/*
getCssTemplate(url) {
return this.xhrCall(url);
}
*/
getHtmlTemplate(url) {
return this.xhrCall(url);
}
}
<div class="card">
<div class="circle">1</div>
<h1>View One</h1>
<p>Ut labores minimum atomorum pro. Laudem tibique ut has.</p>
<p>Lorem ipsum dolor sit amet, per in nusquam nominavi periculis, sit elit oportere ea.Lorem ipsum dolor sit amet, per in nusquam nominavi periculis, sit elit oportere ea.Cu mei vide viris gloriatur, at populo eripuit sit.</p>
</div>
import { PolymerElement, html } from '@polymer/polymer/polymer-element.js';
import './shared-styles.js';
import { TemplateService } from './services/template.service.js';
class MyView1 extends PolymerElement {
constructor() {
super();
this.tpl = new TemplateService();
this.getView(); // <---------------call getView in the constructor.
}
static get template() {
return html `<style include="shared-styles">
:host {
display: block;
padding: 10px;
}
</style>
`;
}
getView() {
let template$ = this.tpl.getHtmlTemplate('src/templates/html/my-view1.html');
// get the promise in a var above.
template$.then(file => {
let wrapperDiv = document.createElement('div'); // create a node
wrapperDiv.innerHTML = file; // push the contents
this._attachDom(wrapperDiv); // Attach the DOM to component's custom element**
});
}
}
window.customElements.define('my-view1', MyView1);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With