Make SkyElement more classy.

The syntax for implementing a SkyElement is now:

<sky-element name="element-name">
<template>
  <!-- template here -->
</template>
<script>
module.exports = class extends SkyElement {
  attached() {
     // ...
  }
  // .. methods here ..
}.register();
</script>
</sky-element>

The register() static method on SkyElement subclasses calls
document.registerElement() and returns the generated constructor.
It uses the parent <sky-element>'s name attribute to set the name
of the element.

R=rafaelw@chromium.org

Review URL: https://codereview.chromium.org/788943003
This commit is contained in:
Elliott Sprehn 2014-12-16 16:28:28 -08:00
parent 6d53b01c8d
commit 0524fc39e4
13 changed files with 67 additions and 43 deletions

View File

@ -6,6 +6,7 @@
<import src="../framework/sky-element/sky-element.sky" as="SkyElement" />
<import src="../framework/xmlhttprequest.sky" as="XMLHttpRequest" />
<sky-element name="file-browser">
<template>
<style>
heading {
@ -21,12 +22,13 @@
</template>
</template>
<script>
SkyElement({
name: 'file-browser',
url: '',
files: [],
directories: [],
attached: function() {
module.exports = class extends SkyElement {
created() {
this.url = '';
this.files = [];
this.directories = [];
}
attached() {
this.url = this.ownerDocument.URL;
var xhr = new XMLHttpRequest();
xhr.open('GET', this.url + '?format=json');
@ -37,5 +39,6 @@ SkyElement({
}).bind(this);
xhr.send();
}
});
}.register();
</script>
</sky-element>

View File

@ -1,4 +1,6 @@
<import src="../../framework/sky-element/sky-element.sky" as="SkyElement" />
<sky-element name="app-header">
<template>
<style>
:host {
@ -12,7 +14,7 @@
<content></content>
</template>
<script>
SkyElement({
name: "app-header"
});
module.exports = class extends SkyElement {
}.register();
</script>
</sky-element>

View File

@ -1,4 +1,6 @@
<import src="../../framework/sky-element/sky-element.sky" as="SkyElement" />
<sky-element name="app-menu-button">
<template>
<style>
:host {
@ -13,7 +15,7 @@
<content></content>
</template>
<script>
SkyElement({
name: "app-menu-button"
});
module.exports = class extends SkyElement {
}.register();
</script>
</sky-element>

View File

@ -1,4 +1,6 @@
<import src="../../framework/sky-element/sky-element.sky" as="SkyElement" />
<sky-element name="app-panel-content">
<template>
<style>
:host {
@ -8,7 +10,7 @@
<content></content>
</template>
<script>
SkyElement({
name: "app-panel-content"
});
module.exports = class extends SkyElement {
}.register();
</script>
</sky-element>

View File

@ -1,4 +1,6 @@
<import src="../../framework/sky-element/sky-element.sky" as="SkyElement" />
<sky-element name="app-panel-header">
<template>
<style>
:host {
@ -11,7 +13,7 @@
<content></content>
</template>
<script>
SkyElement({
name: "app-panel-header"
});
module.exports = class extends SkyElement {
}.register();
</script>
</sky-element>

View File

@ -1,4 +1,6 @@
<import src="../../framework/sky-element/sky-element.sky" as="SkyElement" />
<sky-element name="app-panel">
<template>
<style>
:host {
@ -10,7 +12,7 @@
<content></content>
</template>
<script>
SkyElement({
name: "app-panel"
});
module.exports = class extends SkyElement {
}.register();
</script>
</sky-element>

View File

@ -1,4 +1,6 @@
<import src="../../framework/sky-element/sky-element.sky" as="SkyElement" />
<sky-element name="app-scrollable">
<template>
<style>
:host {
@ -10,7 +12,7 @@
<content></content>
</template>
<script>
SkyElement({
name: "app-scrollable"
});
module.exports = class extends SkyElement {
}.register();
</script>
</sky-element>

View File

@ -1,4 +1,6 @@
<import src="../../framework/sky-element/sky-element.sky" as="SkyElement" />
<sky-element name="app-search-input">
<template>
<style>
:host {
@ -19,7 +21,7 @@
<span class="input-text"><t>flights today to dc by price</t></span>
</template>
<script>
SkyElement({
name: "app-search-input"
});
module.exports = class extends SkyElement {
}.register();
</script>
</sky-element>

View File

@ -1,4 +1,6 @@
<import src="../../framework/sky-element/sky-element.sky" as="SkyElement" />
<sky-element name="app-title">
<template>
<style>
:host {
@ -12,7 +14,7 @@
<content></content>
</template>
<script>
SkyElement({
name: "app-title"
});
module.exports = class extends SkyElement {
}.register();
</script>
</sky-element>

View File

@ -1,4 +1,6 @@
<import src="../../framework/sky-element/sky-element.sky" as="SkyElement" />
<sky-element name="app-toast">
<template>
<style>
:host {
@ -30,7 +32,7 @@
</div>
</template>
<script>
SkyElement({
name: "app-toast"
});
module.exports = class extends SkyElement {
}.register();
</script>
</sky-element>

View File

@ -1,4 +1,6 @@
<import src="../../framework/sky-element/sky-element.sky" as="SkyElement" />
<sky-element name="app-toolbar">
<template>
<style>
:host {
@ -9,7 +11,7 @@
<content></content>
</template>
<script>
SkyElement({
name: "app-toolbar"
});
module.exports = class extends SkyElement {
}.register();
</script>
</sky-element>

View File

@ -10,6 +10,7 @@
<import src="app-scrollable.sky" />
<import src="app-toast.sky" />
<sky-element name="flights-app">
<template>
<style>
* { box-sizing: border-box; }
@ -200,7 +201,7 @@
</app-toast>
</template>
<script>
SkyElement({
name: "flights-app",
});
module.exports = class extends SkyElement {
}.register();
</script>
</sky-element>

View File

@ -1,5 +1,5 @@
<sky>
<import src="flights-app.sky" />
<import src="flights-app.sky" as="FlightsAppElement"/>
<style>
sky {
height: 100%;
@ -8,8 +8,8 @@
<script>
// TODO(esprehn): Work around a bug where having <flights-app /> in the
// page doesn't render anything until the first input event.
addEventListener("load", function() {
document.querySelector("sky").appendChild(document.createElement("flights-app"));
window.addEventListener("load", function() {
document.querySelector("sky").appendChild(new FlightsAppElement());
});
</script>
</sky>