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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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