Sobre nuestro ejemplo anterior, haremos un nuevo componente vt-etiqueta
mkdir src/componentes/etiquetas/El contenido del fichero src/componentes/etiquetas/vt-etiqueta.html es el siguiente:
<link href="../../../bower_components/polymer/polymer-element.html" rel="import"></link>
<dom-module id="vt-etiqueta">
<template>
<style>
:host {
display: block;
}
</style>
<label>Etiqueta componente: [[contenido]] </label>
</template>
<script>
class VtEtiqueta extends Polymer.Element {
static get is() {
return 'vt-etiqueta';
}
static get properties (){
return {
contenido: {
type: String,
}
}
}
}
window.customElements.define(VtEtiqueta.is, VtEtiqueta);
</script>
</dom-module>
Luego, hemos de añadirlo en el componente polymer-muestra-inicial-app, que tiene la mayor jerarquía en nuestra aplicación. Primero un import en forma de etiqueta <link>
y luego una etiqueta propiamente dicha. El código de src/polymer-muestra-inicial-app/polymer-muestra-inicial-app.html queda ahora de la siguiente forma:
<link rel="import" href="../../bower_components/polymer/polymer-element.html">
<link rel="import" href="/src/componentes/entradas/vt-entrada.html">
<link rel="import" href="/src/componentes/etiquetas/vt-etiqueta.html">
<dom-module id="polymer-muestra-inicial-app">
<template>
<style>
:host {
display: block;
}
</style>
<h2>Hello [[prop1]]!</h2>
<vt-entrada contenido="{{contenido}}"></vt-entrada>
<vt-etiqueta contenido="[[contenido]]"></vt-etiqueta>
</template>
<script>
/**
* @customElement
* @polymer
*/
class PolymerMuestraInicialApp extends Polymer.Element {
static get is() { return 'polymer-muestra-inicial-app'; }
static get properties() {
return {
prop1: {
type: String,
value: 'polymer-muestra-inicial-app'
},
contenido:{
type: String,
value: 'Desde componente host'
}
};
}
}
window.customElements.define(PolymerMuestraInicialApp.is, PolymerMuestraInicialApp);
</script>
</dom-module>
El contenido de vt-etiqueta, expuesto en la propiedad contenido será actualizado desde nuestro componente anterior, vt-entrada.Para que eso suceda, modificamos la definición de este último en src/componentes/entradas/vt-entrada.html, configurando el atributo notify de dicha propiedad a true. Una pequeña línea no debería ser razón para volver a presentar todo el código, pero es gratis:
<link rel="import" href="../../../bower_components/polymer/polymer-element.html">
<dom-module id="vt-entrada">
<template>
<style>
:host {
display: block;
}
</style>
<input type="text" value="{{contenido::input}}">
<p> Este es nuestro contenido escribiente: [[contenido]]</p>
</template>
<script>
class VtEntrada extends Polymer.Element {
static get is() {
return 'vt-entrada';
}
static get properties() {
return {
contenido: {
type: String,
notify: true,
}
}
}
}
window.customElements.define(VtEntrada.is, VtEntrada);
</script>
</dom-module>
Al escribir en la caja de texto del componente vt-entrada, el contenido de vt-etiqueta se va modificando.Para tener en mente según lo visto:
- Los binding [[propiedad]] son unidireccionales. (Padre al hijo)
- Los binding {{propiedad}} son bidireccionales. (Padre al hijo y viceversa)
- Para que esto último funcione con propiedades que han de modificarse en un componente hijo, es preciso que la propiedad tenga configurada notify: true en dicho hijo.
Para ejemplo, basta con agregar otro vt-entrada en src/polymer-muestra-inicial-app/polymer-muestra-inicial-app.html cuyo contenido haga binding bidireccional con prop1, que es la propiedad que muestra del Hola Mundo de nuestra aplicación. Es un pequeño cambio, pero como copiar y pegar es sencillo:
<link rel="import" href="../../bower_components/polymer/polymer-element.html">
<link rel="import" href="/src/componentes/entradas/vt-entrada.html">
<link rel="import" href="/src/componentes/etiquetas/vt-etiqueta.html">
<dom-module id="polymer-muestra-inicial-app">
<template>
<style>
:host {
display: block;
}
</style>
<h2>Hello [[prop1]]!</h2>
<vt-entrada contenido="{{contenido}}"></vt-entrada>
<vt-entrada contenido="{{prop1}}"></vt-entrada>
<vt-etiqueta contenido="[[contenido]]"></vt-etiqueta>
</template>
<script>
/**
* @customElement
* @polymer
*/
class PolymerMuestraInicialApp extends Polymer.Element {
static get is() { return 'polymer-muestra-inicial-app'; }
static get properties() {
return {
prop1: {
type: String,
value: 'polymer-muestra-inicial-app'
},
contenido:{
type: String,
value: 'Desde componente host'
}
};
}
}
window.customElements.define(PolymerMuestraInicialApp.is, PolymerMuestraInicialApp);
</script>
</dom-module>
Desde el navegador, lo vemos de la siguiente forma:Seguimos sin hacer que esto parezca algo mínimamente serio, pero al menos se esta volviendo cada vez más divertido.


No hay comentarios:
Publicar un comentario