Polymer 101

Web components

Web Components are low-level primitives that let you define your own HTML Elements.

 

Custom Elements

Shadow Dom

Template

Native client templating

Scoping and encapsulation

Define new tags

Imports

Import HTML files

Template

Allows you to declare fragments of DOM which are parsed, inert at page load, and instantiated later at runtime. ​

<template id="sdtemplate">
  <style>
    p { color: orange; }
  </style>
  <p>I´m in a template</p>
</template>

Custom elements

Allows you to create new HTML tags with custom properties and behaviour

var XFooProto = Object.create(HTMLElement.prototype);

// 1. Give x-foo a foo() method.
XFooProto.foo = function() {
  alert('foo() called');
};

// 2. Define a property read-only "bar".
Object.defineProperty(XFooProto, "bar", {value: 5});

// 3. Register x-foo's definition.
var XFoo = document.registerElement('x-foo', {prototype: XFooProto});

// 4. Instantiate an x-foo.
var xfoo = document.createElement('x-foo');

// 5. Add it to the page.
document.body.appendChild(xfoo);

Custom elements

Shadow Dom

Allows you to declare fragments of DOM which are parsed, inert at page load, and instantiated later at runtime. ​

Allows you to declare fragments of DOM which are parsed, inert at page load, and instantiated later at runtime. ​


v0
  var shadow = element.createShadowRoot();
v1
  var shadow = element.attachShadow();

 

 

Frameworks

Browser

Browser

WEB COMPONENTS

vs

WHY WEB COMPONENTS

I want to add a google map marker!

Too much code!

<div id="map"></div>

<script src=“http://maps.googleapis.com/maps/api/js?callback=mapReady">

</script>

<script>

 var marker = null;

 function getCurrentLocation(callback) {

   navigator.geolocation.watchPosition(callback);

 }

 function addMarker(opts, info) {

   var marker = new google.maps.Marker(opts);

   var infoWindow = new google.maps.InfoWindow({content: info});

   google.maps.event.addListener(marker, 'click', function() {

     infoWindow.open(opts.map, marker);

   });

 

   return marker;

 }

 

 function mapReady() {

   var container = document.querySelector('#map');

   var map = new google.maps.Map(container, {

     zoom: 14, disableDefaultUI: true

   });

 

   getCurrentLocation(function(pos) {

     var current = new google.maps.LatLng(pos.coords.latitude,

                                          pos.coords.longitude);

     map.setCenter(current);

 

     // Re-position marker or create new one.

     if (marker) {

       marker.setPosition(map.getCenter());

     } else {

       marker = addMarker({

         position: current, map: map, title: 'Your location'

       }, '<b>Your location</b>');

     }

   });

 }

</script>

 

<google-map latitude="40.2"></google-map>

POLYMER

¿ is ready  for production?

google music /  youtube gaming / youtube / santatracker / ing australia / bbva

Tell me more

Polymer

is a web components library

 

NOT A FRAMEWORK

polymer

  
<icon-toggle></icon-toggle>

<dom-module id="icon-toggle">
  <template>
    <article> Icon </article>
  </template>

  <script>
    Polymer({
      is: 'icon-toggle'
    });
  </script>
</dom-module>

basic component

Template and interface declaration

Properties and functions declaration

<dom-module id="icon-toggle">
  <style> </style>
  <template> <h1></h1></template>
</dom-module>
  <script>
    Polymer({
      is: 'icon-toggle'
    });
  </script>

Syntax

  <template>
    <p> [[ name ]] </p>  // one-way
    <my-comp value="{{ name }}"> // two-way
    </my-comp>
  </template>

  <script>
    Polymer({
      is: 'icon-toggle',
      properties: { 
        name: { type: String, value: 'Hola' } 
      }
    });
  </script>

Syntax

Conditional

Repeating

  <template is="dom-if" if="{{myBoolean}}">
    <p> [[ name ]] </p>
    <iron-input value="{{ name }}"></iron-input>
  </template>
  <template is="dom-repeat" items="{{myArray}}">
    <p> [[ item.name ]] </p>
    <my-cmp value="{{ item.name }}"></my-cmp>
  </template>

properties

Polymer({ 
  is: 'my-comp', // has to be kebab-case
  properties: {
    my-prop: {
      type: String,
      value: 'test',
      notify: true,
      observer: 'myFunc',
      computed: '_getValue(name)'
    }
  }
});

properties

type

- Defines the type of the property

- Some Polymer tools expects concrete types

- String, Number, Array, Object

Value

- Set the initial value of the property

- If it´s not defined, sets to 'undefined'

- Has lower priority than specified attributes

properties

notify

- Generates a '*-changed' event automatically

- Has to be true to two-way data communication

observer

- Call the specified function when the value changes

- Usefull to react to changes on two-way communications

properties

COMPUTED

- Execute a function to set his own value

- Can`t be setted. Read-only value

- Reacts to specified properties changes

title: { 
  type: String, 
  computed: '_getTitle(name)' 
},
_getTitle: function(){ 
  return 'Mr.'+name;
}

properties

<my-comp title="Juan"></my-comp>

...

title: { 
  type: String, 
  value: 'name' 
}

EVENTS AND COMPONENTS COMMUNICATION

use the platform!

Native events

listeners

<template>
  <button on-tap="_myFunc"></button>
</template>

<script>
  Polymer({ 
   is:'...',
   _myFunc: function() { 
     console.info("button clicked");
   }
</script>

Inline events

listeners

<template>
  <button></button>
</template>

<script>
  Polymer({ 
   is:'...',
   listeners: {
     'tap': '_myFunc'
   },
   _myFunc: function(){ console.info("tapped!"); }
  })
</script>

Listeners object

native events

listeners

  Polymer({ 
   is:'...',
   listeners: {
     'tap': '_myFunc',
     'my-custom-event': '_myOtherFunc'
   },
   _myFunc: function(){ 
     this.fire('my-custom-event', { value: 5}); 
   },
   _myOtherFunc: function(data) { 
     console.info(data.value);
   }
  })

Listeners object + Polymer.fire

custom events

app-main

Polymer({ . . . })

binding

events

components custom styles

custom variables

Focus on create custom variables for every css property that could be sensible of changes

custom variables

my-component.css

:host {
  background: var(--my-component-background-color, #ff0000);
  color: var(--my-component-color, #cecece);
}
father-component.css

:host {
  --my-component-background-color: #d3d3d3;
  --my-component-color: #000000;
}

Tools for elements develop

iron-component-pages

Allows  the developer to easily generate a Polymer-element-like documentation, based on code comments and DDD (Demo Driven Development)

TURNING THIS

  Polymer({ 
   is:'...',
   
   properties: {
     /**
     * show the name of the current user
     */
   }
   listeners: {
     'tap': '_myFunc'
   },
   /**
   * Function to inform about on-tap event and execution
   */
   _myFunc: function(){ console.info("tapped!"); }
  })

ON THIS

THERE IS AN ELEMENT FOR THAT

Polymer catalog

paper-elements

visual elements with material design

iron-elements

functional elements

app-elements

Architectural elements

LET´S TRY!

Polymer

By Jon Rojí

Polymer

  • 1,163