Properties
Properties are used for data binding, which is an essential part of any modern web framework.
Let’s consider a component that demonstrates binding abilities of Polymer. It is an input where users can type something, and all they are typing is duplicated below by using property binding.
Guesser component
Source code
<html>
<head>
<link rel="import" href="src/polymer-basic/properties/name-guesser.html">
<script src="bower_components/webcomponentsjs/webcomponents-loader.js"></script>
</head>
<body>
<name-guesser placeholder="Your name goes here"></name-guesser>
</body>
</html>
<link rel="import" href="../../../bower_components/polymer/polymer-element.html">
<!-- iron-input is a Polymer element from standard Polymer library. -->
<!-- It enhances standard HTML input by providing an ability of two-way binding. -->
<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
<dom-module id="name-guesser">
<template>
<h4>
Please enter your name:
</h4>
<!-- iron-input works as a wrapper for a simple HTML input -->
<iron-input bind-value="{{name}}">
<input placeholder="[[placeholder]]" />
</iron-input>
<br/>
<br/>
<div>
Your name is: [[name]]
</div>
</template>
<script>
class NameGuesser extends Polymer.Element {
static get is() {
return 'name-guesser';
}
static get properties() {
// Properties configuration object contains a map of properties.
// Key is a name of a property, value is a configuration.
return {
name: String,
placeholder: {
type: String,
value: 'Your name please'
}
}
}
}
customElements.define(NameGuesser.is, NameGuesser);
</script>
</dom-module>
There are two types of binding:
-
[[ ]]- one-way binding. An enclosed component listens to changes of a property and refreshes its state. In other words, the data flows downward - from the host component to children components.In our example, the
placeholderproperty uses one-way binding: we just pass its value down to theinputcomponent. -
{{ }}- two-way binding. An enclosed component not only listens to property changes but can also change the property value itself. That is the data can flow both ways - from host to children and back.In our example, the
nameproperty uses two-way binding to receive a value from theiron-inputcomponent and display it indiv.
In this example, we could use two-way binding for all properties and the component would still work as expected. But it’s important to choose a correct binding, because it increases code readability and simplifies refactoring. Always prefer one-way bindings and use two-way bindings only when necessary.
A Polymer component can configure all its properties in an object returned by the properties getter. It can just specify a type of a property (String, Boolean, Number, Object, Array, Date) or provide a number of different parameters. One of these parameters is value which specifies a default value for the property.
In our example, the placeholder property has default value "Your name please". But it’s overwritten with "Your name goes here" passed from the host name-guesser element defined in index.html. We could also provide a name, e.g.
<name-guesser name="Charlie"></name-guesser>
That would cause the input to be filled on initialization:
Apart from value, a property can have a number of other attributes (observer, notify, etc.) that partially will be reviewed further.
Pay attention to the following important detail: properties are named in CamelCase in JavaScript but in kebab-case in HTML. For example, the bind-value property of the iron-input component is defined in the source code of the component as follows:
...
properties: {
/**
* Use this property instead of `value` for two-way data binding.
*/
bindValue: {
type: String
},
...
Also, there are some native properties like class that do not support property binding. You should use attribute bindings instead to interact with such properties.
- What we have learned so far
-
-
Use
[[ ]]for one-way binding. -
Use
{{ }}for two-way binding. -
Describe your properties in an object returned by the
propertiesgetter. -
For each property you can define type, default value and a number of other parameters.
-
You can provide properties from outside of a Polymer component by using HTML attributes.
-
iron-inputis a Polymer component that allows you to use two-way binding ininputelement.
-