Как отобразить веб-компонент <google-chart> в Polymer

ПРИМЕЧАНИЕ: ОБНОВЛЕНИЯ (включая решение) к этому вопросу в конце...

Я не могу получить <google-chart> элемент для отображения на моей странице.

Я использовал генератор полимеров Yeoman для создания проекта Polymer. Я добавил некоторые пользовательские элементы, а также импортировал и создал элементы из железа и бумаги из каталога полимеров. Я использую стандартную процедуру для этого:

  1. bower install --save [[polymerElement]], затем
  2. <link rel="import" href="../bower.../[[element]].html"> в elements.html,

После <google-chart> инструкции в разделе каталога веб-компонентов Google, я попытался представить их пример круговой диаграммы на моей странице. Хотя элемент не отображается правильно, в консоли нет ошибок, в содержимом страницы для элемента есть пробел, и в моем инспекторе появляется вся разметка, с двумя исключениями:

  1. Рендеринг HTML не включает в себя атрибут "строки", который я не могу исправить.
  2. Внутреннее содержание <google-chart> Компонент довольно редкий, всего 3 дочерних элемента:
    • <iron-ajax>
    • <div>
    • <google-legacy-loader>

Вот соответствующий код:

elements.html:

<!-- Iron elements -->
<link rel="import" href="../bower_components/iron-component-page/iron-component-page.html">
<link rel="import" href="../bower_components/iron-flex-layout/classes/iron-flex-layout.html">
<link rel="import" href="../bower_components/iron-icons/iron-icons.html">
<link rel="import" href="../bower_components/iron-icons/maps-icons.html">
<link rel="import" href="../bower_components/iron-icons/social-icons.html">
<link rel="import" href="../bower_components/iron-pages/iron-pages.html">
<link rel="import" href="../bower_components/iron-selector/iron-selector.html">

<!-- Paper elements -->
<link rel="import" href="../bower_components/paper-drawer-panel/paper-drawer-panel.html">
<link rel="import" href="../bower_components/paper-dropdown-menu/paper-dropdown-menu.html">
<link rel="import" href="../bower_components/paper-icon-button/paper-icon-button.html">
<link rel="import" href="../bower_components/paper-item/paper-item.html">
<link rel="import" href="../bower_components/paper-material/paper-material.html">
<link rel="import" href="../bower_components/paper-menu/paper-menu.html">
<link rel="import" href="../bower_components/paper-scroll-header-panel/paper-scroll-header-panel.html">
<link rel="import" href="../bower_components/paper-styles/paper-styles-classes.html">
<link rel="import" href="../bower_components/paper-toast/paper-toast.html">
<link rel="import" href="../bower_components/paper-toolbar/paper-toolbar.html">

<!-- 3rd Party Components -->
<link rel="import" href="../bower_components/google-apis/google-apis.html">
<link rel="import" href="../bower_components/google-apis/google-js-api.html">
<link rel="import" href="../bower_components/google-chart/google-chart.html">

<!-- etc... -->

index.html:

<section data-route="dashboard">
    <h2 class="page-title">Data Dashboard</h2>
    <p>This is the dashboard section</p>
    <p>This is a 'google-chart' object:</p>
    <google-chart type='pie' options='{"title": "Distribution of days in 2001Q1"}' rows='[["Jan", 31], ["Feb", 28], ["Mar", 31]]' cols='[{"label":"Month", "type":"string"}, {"label":"Days", "type":"number"}]'></google-chart>

    <p>You can get more info here:</p>
    <a href="https://elements.polymer-project.org/elements/google-chart">https://elements.polymer-project.org/elements/google-chart</a>
</section>
<!-- etc... -->

ОБНОВИТЬ:

Как сказал Supersharp, это <google-charts> код загружается в одностраничной среде.

Что касается загрузки в среде полимеров с поддержкой Yeoman, в которой я работаю, после дальнейшего тестирования кажется, что <google-chart> объект загрузится в основной app/index.html файл, пока он не находится в <template> тег:

<!doctype html>
<html lang="">

<head>
    ...
    <!-- build:css styles/main.css -->
    <link rel="stylesheet" href="styles/main.css">
    <!-- endbuild-->

    <!-- build:js bower_components/webcomponentsjs/webcomponents-lite.min.js -->
    <script src="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
    <!-- endbuild -->

    <!-- will be replaced with elements/elements.vulcanized.html -->
    <link rel="import" href="elements/elements.html">
    <!-- endreplace-->

    <!-- For shared styles, shared-styles.html import in elements.html -->
    <style is="custom-style" include="shared-styles"></style>
</head>

<body unresolved class="fullbleed layout vertical">
    <span id="browser-sync-binding"></span>

NOTE: google-chart will load here...

    <template is="dom-bind" id="app">

NOTE: google-chart WON'T load here or in any of the elements below...

        <paper-drawer-panel id="paperDrawerPanel">
            <!-- Drawer Scroll Header Panel -->
            <paper-scroll-header-panel drawer>
                <!-- Drawer Toolbar -->
                <paper-toolbar id="drawerToolbar"> ... </paper-toolbar>
                <!-- Nav Menu Section Title -->
                <paper-item class="menu-section-title"> ... </paper-item>
                <!-- Drawer Section Content -->
                <paper-menu class="list" attr-for-selected="data-route" selected="[[route]]"> ... </paper-menu>
            </paper-scroll-header-panel>
            <!-- Main Area -->
            <paper-scroll-header-panel main condenses keep-condensed-header>
                <!-- Main Toolbar -->
                <paper-toolbar id="mainToolbar" class="tall" alt-class="medium-tall"> ... </paper-toolbar>
                <!-- Main Content -->
                <div class="content"> ... </div>
            </paper-scroll-header-panel>
        </paper-drawer-panel>
    </template>

NOTE: google-chart will load here...

    <!-- build:js scripts/app.js -->
    <script src="scripts/userData.js"></script>
    <script src="scripts/app.js"></script>
    <!-- endbuild-->
</body>
</html>

Тем не менее, мне нужно <google-charts> компонент загружен в этом <template> блок (где все остальное содержимое).

Может кто-нибудь объяснить, почему это не будет загружаться в <template> блок?

Может кто-нибудь еще объяснить, как я могу заставить этот элемент отображать, где я хочу в приложении?

Спасибо всем большое заранее.


РЕШЕНИЕ:

Используя обратные вызовы регистрации и жизненного цикла, я успешно преобразовал это в шаблон с помощью следующего метода:

Сначала добавьте запрашиваемый элемент в <template> элемент, служащий контейнером:

<p>This is a 'google-chart' object:</p>
<figure id="chart-container"></figure>

Во-вторых, внутри Polymer() конструктор, создать <google-chart> элемент и прикрепить его к контейнеру как часть attached событие жизненного цикла:

attached: function() {
  // create an instance with createElement:
  var chartContainer = document.querySelector('figure#chart-container');

  var pieChartAttributes = {
    'id': 'pie-chart',
    'type': 'pie',
    'options': '{"title": "Distribution of days in 2001Q1"}',
    'rows': '[["Jan", 31], ["Feb", 28], ["Mar", 31]]',
    'cols': '[{"label":"Month", "type":"string"}, {"label":"Days", "type":"number"}]',
  };

  var pieChart = document.createElement('google-chart');

  for (var key in pieChartAttributes) {
    pieChart.setAttribute(key, pieChartAttributes[key]);
  }

  chartContainer.appendChild(pieChart);
} // end attached()

Несмотря на небольшую задержку отображения элемента на экране, это рабочее решение.

2 ответа

Решение

Я скопировал и вставил ваш код в один файл, и это сработало:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="import" href="/scripts/components/google-chart/google-chart.html">
</head>
<body>
    <section data-route="dashboard">
        <h2 class="page-title">Data Dashboard</h2>
        <p>This is the dashboard section</p>
        <p>This is a 'google-chart' object:</p>
        <google-chart type='pie' options='{"title": "Distribution of days in 2001Q1"}' rows='[["Jan", 31], ["Feb", 28], ["Mar", 31]]' cols='[{"label":"Month", "type":"string"}, {"label":"Days", "type":"number"}]'></google-chart>

        <p>You can get more info here:</p>
        <a href="https://elements.polymer-project.org/elements/google-chart">https://elements.polymer-project.org/elements/google-chart</a>
    </section>
</body>
</html>

Примечание: только пользовательский элемент, который вы явно используете (т.е. google-chart) должен быть импортирован как <link>,

ОБНОВИТЬ

<template> содержание никогда не отображается. Это основная цель этого типа элемента. Вам придется скопировать его содержимое в другой элемент (не template!) в основном document сделать это видимым. Другие вложенные элементы не будут отображаться больше. Пример тут.

Как описано здесь:

вставить пробелы в

'rows': '[ ["Jan", 31], ["Feb", 28], ["Mar", 31] ]',

вместо

'rows': '[["Jan", 31], ["Feb", 28], ["Mar", 31]]',

потому что внутри шаблона [[ ]] распознается односторонняя привязка данных.

Другие вопросы по тегам