Elliott Sprehn 6d61fe6ce8 Automate reflected properties in SkyElement.
Now you can use the attributes attribute on <sky-element> that
accepts a set of name:type comma separated pairs to control
the reflected attributes. ex. attributes="size:number"

Each attribute creates a getter and a setter on the element that returns
the correct type and will coerce the string attribute values into the
right type. It also correctly hooks into the data binding system.

A new callback is added: {name}Changed(oldValue, newValue) which will
be invoked whenever the attribute with that name changes and gets the
correctly coerced type values. See the <sky-radio> or <sky-checkbox>
widgets for examples of using the new callback.

Number attributes default to 0, booleans to false, and strings to empty
string. There is no way provided to set a different default, for that you
can use hasAttribute in the created callback to conditionally set a value.
Don't just assign the property there otherwise you'll overwrite the value
from the parser.

Another behavior change from making this work is that now attributeChanged()
is called for each attribute, even when the element is created by the
parser.

Overall this allows a nice simplification to the <sky-button>,
<sky-radio> and <sky-checkbox> widgets.

R=abarth@chromium.org

Review URL: https://codereview.chromium.org/836923002
2015-01-05 20:12:58 -08:00
..
2015-01-02 19:56:45 -08:00

SkyElement

SkyElement is the framework for creating...yup...Sky Elements. It take heavy inspriation from Polymer and isn't very fully featured...yet

Declaring an element

<import src="../path/to/sky-element.sky" as="SkyElement" />
<template>
  <my-other-element>Hello, {{ place }}</my-other-element>
</template>
<script>
// SkyElement takes a single object as it's only parameter
SkyElement({
  name: 'my-element', // required. The element's tag-name
  attached: function() {
    this.place = 'World';
  }, // optional
  detached: function() {}, // optional
  attributeChanged: function(attrName, newValue, oldValue) {} // optional
});
</script>

Note that an element's declared ShadowDOM is the previous <template> element to the <script> element which defines the element.

Databinding

SkyElement's databinding support is derived from Polymer's. At the moment, there are some key differences:

There is not yet support for

  • Declarative event handlers
  • Inline expressions
  • Self-observation (e.g. fooChanged() gets invoked when this.foo is changed)
  • Computed properties (e.g. the computed block)
  • Conditional attributes (e.g. <my-foo checked?="{{ val }}")

Also, because there are so few built-in elements in Sky, the default behavior of HTMLElement with bindings is to assign to the property. e.g.

<my-foo bar="{{ bas }}">

Will not setAttribute on the my-foo, instead it will assign to the bar property of my-foo. There are two exceptions to this: class & style -- those stillsetAttribute.