Cómo crear componentes personalizados

Descripción general

La API de Embed viene con varios componentes integrados y también te permite crear los tuyos con facilidad. En este documento, se explica cómo compilar un nuevo componente personalizado y cómo incluir componentes de terceros en tu aplicación.

Cómo crear un componente personalizado

Los componentes personalizados de la API de Embed se crean llamando a gapi.analytics.createComponent y pasando un nombre de componente y un objeto de métodos.

El nombre que se pase a createComponent será el nombre de la función del constructor del componente y se almacenará en gapi.analytics.ext. El objeto de métodos debe contener las funciones o propiedades que desees agregar al prototipo del componente.

gapi.analytics.createComponent('MyComponent', {
  execute: function() {
    alert('I have been executed!');
  }
});

Una vez que se crea el componente, se puede usar llamando al operador new con el constructor del componente.

// Create a new instance of MyComponent.
var myComponentInstance = new gapi.analytics.ext.MyComponent();

// Invoke the `execute` method.
myComponentInstance.execute() // Alerts "I have been executed!"

El método de inicialización

Pasar un objeto de métodos a createComponent te da acceso al prototipo de tu componente, pero no al constructor de tu componente.

Para solucionar este problema, cuando se creen nuevos componentes de la API de Embed, se buscarán automáticamente la presencia de un método llamado initialize. Si se encuentra, se invocará con el mismo arguments pasado al constructor. En su lugar, toda la lógica que normalmente usarías en un constructor se debe incluir en el método de inicialización.

En este ejemplo, se configuran algunas propiedades predeterminadas cuando se crean nuevas instancias de MyComponent.

gapi.analytics.createComponent('MyComponent', {
  initialize: function(options) {
    this.name = options.name;
    this.isRendered = false;
  }
});

var myComponentInstance = new gapi.analytics.ext.MyComponent({name: 'John'});
alert(myComponentInstance.name); // Alerts "John"
alert(myComponentInstance.isRendered); // Alerts false

Métodos heredados

Los componentes creados con el método createComponent heredarán automáticamente los métodos básicos compartidos por todos los componentes integrados (get, set, on, once, off, emit). Esto garantiza que todos los componentes funcionen de manera coherente y predecible.

Por ejemplo, si tu componente requiere que el usuario esté autorizado, esto se puede lograr con métodos de control de eventos heredados.

gapi.analytics.createComponent('MyComponent', {
  initialize: function() {
    this.isRendered = false;
  },
  execute: function() {
    if (gapi.analytics.auth.isAuthorized()) {
      this.render();
    }
    else {
      gapi.analytics.auth.once('success', this.render.bind(this));
    }
  },
  render: function() {
    if (this.isRendered == false) {

      // Render this component...

      this.isRendered = true;
      this.emit('render');
    }
  }
});

var myComponentInstance = new gapi.analytics.ext.MyComponent();

// Calling execute here will delay rendering until after
// the user has been successfully authorized.
myComponentInstance.execute();
myComponentInstance.on('render', function() {
  // Do something when the component renders.
});

Esperando a que la biblioteca esté lista

El fragmento de la API de Embed carga la biblioteca y todas sus dependencias de manera asíncrona. Eso significa que los métodos como createComponent no estarán disponibles de inmediato y que el código que los invoque debe aplazarse hasta que se cargue todo.

La API de Embed proporciona el método gapi.analytics.ready que acepta una devolución de llamada que se invocará cuando la biblioteca esté completamente cargada. Cuando creas componentes personalizados, siempre debes unir tu código dentro de la función ready para que no se ejecute antes de que existan todos los métodos obligatorios.

gapi.analytics.ready(function() {

  // This code will not run until the Embed API is fully loaded.
  gapi.analytics.createComponent('MyComponent', {
    execute: function() {
      // ...
    }
  });
});

Utiliza componentes de terceros

Por lo general, los componentes de la API de Embed de terceros se empaquetan como archivos JavaScript individuales que puedes incluir en tu página mediante una etiqueta <script>.

El orden de carga es importante, por lo que es importante incluir primero el fragmento de la API de Embed y, luego, seguir las secuencias de comandos de los componentes y cualquiera de sus dependencias.

<!-- Include the Embed API snippet first. -->
<script>
(function(w,d,s,g,js,fjs){
  g=w.gapi||(w.gapi={});g.analytics={q:[],ready:function(cb){this.q.push(cb)}};
  js=d.createElement(s);fjs=d.getElementsByTagName(s)[0];
  js.src='https://apis.google.com/js/platform.js';
  fjs.parentNode.insertBefore(js,fjs);js.onload=function(){g.load('analytics')};
}(window,document,'script'));
</script>
<!-- Then include your components. -->
<script src="path/to/component.js"></script>
<script src="path/to/another-component.js"></script>

Administración de dependencias

Un componente puede tener dependencias, como una biblioteca de gráficos, como d3.js, o una biblioteca de formato de fecha, como moment.js. Depende del autor del componente documentar estas dependencias y el usuario del componente garantizar que se cumplan.