Как использовать веб-компонент - PullRequest
0 голосов
/ 31 августа 2018

Уважаемое сообщество Полимеров,

Мне тяжело изучать полимер и следить за документами и учебными пособиями в Интернете.

Я опытный серверный разработчик C ++ и Java. Но мои отношения с front-end и веб-разработкой никогда не были гладкими.

Возможно, это связано с тем, что веб-разработка продолжает меняться очень быстрыми темпами, а документы и учебные пособия предполагают, что пользователь обладает большим опытом работы с предыдущими веб-фреймворками.

Несколько лет назад мне пришлось внедрить веб-интерфейс для встроенного блока, над которым работала моя команда. Я сделал веб-компонент, используя bootstrap и AngularJs. Мне очень понравился этот сторонний проект, и он был свежим воздухом по сравнению с написанием c ++ для встроенной платформы. Мне также очень понравилось, как AngularJs применяли шаблон MVC к веб-странице.

Перенесемся в настоящее, теперь полимерные и веб-компоненты Google - это новые модные тенденции.

Прошел учебник по полимерам и прочитал немного о веб-компонентах. Я думаю, что это хорошая идея повторно использовать веб-компоненты. Просто просмотрите огромную библиотеку существующих веб-компонентов, выберите то, что вы хотите. Звучит неплохо в теории ... за исключением ... новичка, такого как я, не мог целый день правильно использовать один веб-компонент.

Мне не хватает документов, а пример кода неточный. Позвольте мне пройти простой пример. Одним из веб-компонентов, который я хочу использовать, является iron-pages. Потрясающий веб-компонент, и это именно то, что мне нужно!

Я прочитал документы для iron-pages и посмотрел демоверсию на webcomponents.org, и сейчас самое время ее использовать. За исключением того, что я не могу заставить вещь работать.

Вот именно то, что я сделал в командной строке, используя Polymer-Cli

mkdir my-app
cd my-app
polymer init

Я выбрал полимер-2-приложение

Я пробую свое приложение

polymer serve --open

Ура, это показывает Здравствуйте, my-app-app! на веб-странице

Далее я пытаюсь использовать веб-компонент iron-pages. Поэтому мне нужно скачать этот компонент, используя Bower

bower install --save PolymerElements/iron-pages

Демонстрация для iron-pages указана здесь вместе с примером кода. Но пример кода не соответствует тому, что должно отображаться в веб-компоненте ... или, по крайней мере, тому, что я читал в руководствах по использованию веб-компонента.

В этом примере кода нет тега. Есть тег, которого там быть не должно. Я уверен, что опытный веб-разработчик знал бы, как преодолеть разрыв ... но не я.

Я изо всех сил старался адаптировать этот пример кода iron-pages, чтобы он поместился в мой файл src/my-app-app/my-app-app.html

Вот мой код:

<link rel="import" href="../../bower_components/polymer/polymer-element.html">
<link rel="import" href="../../bower_components/iron-pages/iron-pages.html">

<dom-module id="my-app-app">
  <template>
    <style>
      :host {
        display: block;
      }

      iron-pages {
        width: 100%;
        height: 200px;
        font-size: 50px;
        color: white;
        text-align: center;
      }

      iron-pages div {
        width: 100%;
        height: 100%;
        display: flex;
        flex-direction: column;
        justify-content: center;
      }

      iron-pages div:nth-child(1) {
        background-color: var(--google-blue-500);
      }

      iron-pages div:nth-child(2) {
        background-color: var(--google-red-500);
      }

      iron-pages div:nth-child(3) {
        background-color: var(--google-green-500);
      }

    </style>

    <h2>Hello [[prop1]]!</h2>

    <iron-pages selected="0">
       <div>One</div>
       <div>Two</div>
       <div>Three</div>
    </iron-pages>

  </template>

  <script>
    /**
     * @customElement
     * @polymer
     */
    class MyAppApp extends Polymer.Element {
      static get is() { return 'my-app-app'; }
      static get properties() {
        return {
          prop1: {
            type: String,
            value: 'my-app-app'
          }
        };
      }
    }

    window.customElements.define(MyAppApp.is, MyAppApp);

    var pages = document.querySelector('iron-pages');
    pages.addEventListener('click', function(e) {
       pages.selectNext();
    });

  </script>
</dom-module>

iron-pages не отображается на веб-странице. Консоль разработчика на Chrome показывает ошибку, которую я пытаюсь сделать addEventListener по нулевому указателю. Поэтому я попытался закомментировать часть addEventListener. Я ожидаю увидеть один из iron-pages, даже если я не могу нажать, чтобы вращаться среди страниц. Но железные страницы все еще не появляются вообще.

Буду признателен, если один из вас, опытных веб-разработчиков, сможет меня просветить. У меня есть другие примеры других веб-компонентов, которые я не смог бы использовать идеально, например app-toolbar, я не смог отобразить iron-icon ... даже если я установил iron-icon. В любом случае, я был бы счастлив, если бы мог начать с того, что подключил мой iron-pages.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Вы получаете нулевой указатель из-за установки события вне вашего класса. Никакого кода не должно быть, кроме регистрации классов (customElements.define ...)

Обычно в Polymer вы должны устанавливать слушателей в готовом обратном вызове.

Жизненный цикл пользовательского элемента здесь: https://www.polymer -project.org / 2.0 / docs / devguide / custom-elements

В вашем случае:

 ready() {
    super.ready();
    var pages = document.querySelector('iron-pages');
    pages.addEventListener('click', function(e) {
       pages.selectNext();
    });
  }
0 голосов
/ 31 августа 2018

Удалить кавычки и использовать как: bower install --save PolymerElements/iron-pages

вместо: bower install --save PolymerElements/'iron-pages'

А также все одинарные кавычки в вашем коде 'iron-pages' просто используйте iron-pages

DEMO

<link rel="import" href="../../bower_components/polymer/polymer-element.html">
<link rel="import" href="../../bower_components/iron-pages/iron-pages.html">

<dom-module id="my-app-app">
  <template>
    <style>
  :host {
    display: block;
  }

  iron-pages {
    width: 100%;
    height: 200px;
    font-size: 50px;
    color: white;
    text-align: center;
  }

  iron-pages div {
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: column;
    justify-content: center;
  }

  iron-pages div:nth-child(1) {
    background-color: var(--google-blue-500);
  }

  iron-pages div:nth-child(2) {
    background-color: var(--google-red-500);
  }

  iron-pages div:nth-child(3) {
    background-color: var(--google-green-500);
  }

</style>

<h2>Hello [[prop1]]!</h2>

<iron-pages selected="0">
   <div>One</div>
   <div>Two</div>
   <div>Three</div>
</iron-pages>

<script>
 /**
 * @customElement
 * @polymer
 */
class MyAppApp extends Polymer.Element {
  static get is() { return 'my-app-app'; }
  static get properties() {
    return {
      prop1: {
        type: String,
        value: 'my-app-app'
      }
    };
  }
}

window.customElements.define(MyAppApp.is, MyAppApp);

var pages = document.querySelector('iron-pages');
pages.addEventListener('click', function(e) {
   pages.selectNext();
});

...