Статьи

Как интегрировать плагины jQuery в приложение Ember

Эта статья была рецензирована Крейгом Билнером . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!

Благодаря своему повсеместному распространению jQuery по-прежнему играет жизненно важную роль в мире веб-разработки. Его регулярное использование не должно быть сюрпризом, особенно при использовании таких основ, как Ember. Эта структура имеет компоненты, которые похожи на плагины jQuery в том, что они оба предназначены для единой ответственности в вашем проекте.

В этой статье мы разработаем простой компонент Ember. Из этого туториала вы узнаете, как интегрировать плагин jQuery в приложение Ember. Компонент действует как оболочка для плагина, который показывает список миниатюр изображений. Всякий раз, когда мы нажимаем на миниатюру, в окне предварительного просмотра изображения отображается его увеличенная версия. Это работает, извлекая свойство src Затем мы устанавливаем свойство src Полный код этой статьи можно найти на GitHub .

Имея это в виду, давайте начнем работать над этим проектом.

Настройка проекта

Прежде всего, давайте создадим новый проект Ember. Для начала выполните эту команду на CLI:

 npm install -g ember-cli

После этого проект можно создать, запустив:

 ember new emberjquery

Это создаст новый проект в папке с именем emberjquery Теперь перейдите в каталог, написав cd emberjquery

Проект содержит разные файлы, которые мы будем редактировать в этом уроке. Первый файл, который вы должны отредактировать, это файл bower.json Откройте его и измените текущую версию Ember на 2.1.0. Плагин jQuery, который я создал для этого проекта, доступен в виде пакета Bower. Вы можете включить его в проект, добавив эту строку в файл bower.json

 "jquerypic": "https://github.com/LaminSanneh/sitepoint-jquerypic.git#faulty"

Теперь, чтобы установить плагин и новую версию Ember, выполните команду:

 bower install

Поскольку этот плагин не является компонентом Ember, нам нужно вручную включить необходимые файлы. В файле ember-cli-build.js

 // Lines to add
  app.import("bower_components/jquerypic/js/jquerypic.js");
  app.import("bower_components/jquerypic/styles/app.css");

  return app.toTree();
};

Эти строки импортируют два файла и включают их в сборку. Одним из них является сам файл плагина, а другим — файл CSS для плагина. Таблица стилей является необязательной, и вы можете исключить ее, если вы намерены стилизовать плагин самостоятельно.

Создание нового компонента плагина

Как только вы включите плагин в приложение, давайте начнем создавать новый компонент, выполнив команду:

 ember generate component jquery-pic

Эта команда создает файл класса и файл шаблона. В файле шаблона вставьте содержимое из bower_components/jquerypic/index.html Поместите содержимое в тег body

На этом этапе файл шаблона должен выглядеть следующим образом:

 {{yield}}
<div class="jquerypic" >
  <div class="fullversion-container">
    <img src="http://lorempixel.com/640/480/nature/1" alt="" class="full-version" >
  </div>
  <div class="thumbnails">
    <img src="http://lorempixel.com/640/480/nature/1" alt="" class="thumbnail">
    <img src="http://lorempixel.com/640/480/nature/2" alt="" class="thumbnail">
    <img src="http://lorempixel.com/640/480/nature/3" alt="" class="thumbnail">
    <img src="http://lorempixel.com/640/480/nature/4" alt="" class="thumbnail">
    <img src="http://lorempixel.com/640/480/nature/5" alt="" class="thumbnail">
  </div>
</div>

В файле класса добавьте функцию didInsertElement

 import Ember from 'ember';

export default Ember.Component.extend({
  didInsertElement: function () {

  }
});

Сейчас мы находимся в критической точке. В jQuery инициализация плагина обычно происходит внутри функции document.ready

 $(document).ready(function(){
  //Initialize plugin here
});

Вместо этого с компонентами Ember эта инициализация происходит в специальной функции с именем didInsertElement Эта функция вызывается, когда компонент готов и успешно вставлен в DOM. Оборачивая наш код внутри этой функции, мы можем гарантировать две вещи:

  • Плагин инициализируется только для этого компонента
  • Плагин не будет мешать другим компонентам

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

 ember generate template index

Затем добавьте следующий код в шаблон для использования компонента:

 {{jquery-pic}}

После этого загрузите сервер Ember с

 ember serve

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

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

Инициализация компонента Ember

Чтобы показать проблему, давайте начнем с добавления следующего кода в функцию didInsertElement

 $(".jquerypic").jquerypic();

Если вы не используете Ember, вы обычно инициализируете плагин. Теперь проверьте окно браузера и нажмите на миниатюры. Вы должны увидеть, что они загружены в просмотрщик больших изображений, как и предполагалось. Может показаться, что все работает нормально, верно? Что ж, проверьте, что происходит, когда мы добавляем второй экземпляр компонента. Сделайте это, добавив еще одну строку в шаблон индекса, содержащий тот же код, который я показывал ранее. Итак, ваш шаблон должен выглядеть так:

 {{jquery-pic}}
{{jquery-pic}}

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

Чтобы решить эту проблему, нам нужно немного изменить наш инициализатор. Правильное заявление об использовании сообщается ниже:

 this.$(".jquerypic").jquerypic();

Разница в том, что мы сейчас используем this.$$ Два экземпляра компонента теперь должны вести себя правильно. Нажатие на миниатюры для одного экземпляра не должно влиять на другой компонент.

Когда мы используем this.$ Таким образом, любые манипуляции с DOM, которые мы выполняем, влияют только на этот экземпляр компонента. Более того, любой обработчик событий будет установлен именно на этот компонент. Когда мы используем глобальное свойство jQuery $ Вот почему наша первоначальная инициализация затронула другой компонент.

Мне пришлось изменить мой плагин, чтобы продемонстрировать эту ошибку, и это может быть темой будущей статьи. Тем не менее, наилучшей практикой при манипулировании DOM компонента является использование this.$

Уничтожение плагина

Ну, пока мы видели, как настроить обработчики событий. Теперь пришло время показать способ удаления любого события, которое мы настроили с помощью нашего плагина. Это должно быть сделано, когда наш компонент будет удален из DOM. Мы должны сделать это, потому что мы не хотим, чтобы какой-либо избыточный обработчик событий зависал. К счастью, компоненты Ember предоставляют еще один хук, который называется willDestroyElement Этот хук вызывается каждый раз, когда Ember собирается уничтожить и удалить экземпляр компонента из DOM. Мой плагин имеет метод stopEvents Этот метод должен вызываться в специальном хуке, который нам предоставляет Ember. Итак, добавьте в компонент следующую функцию:

 willDestroyElement: function () {
  this.get('jquerypic').stop();
}

Измените didInsertElement function

 didInsertElement: function () {
  var jquerypic = this.$(".jquerypic").jquerypic();
  this.set('jquerypic', jquerypic);
},

В функции didInsertElement Мы выполняем эту операцию, чтобы иметь доступ к ней в других функциях. В функции willDestroyElementstopEvents Хотя это хорошая практика, наше приложение не может вызвать этот хук. Поэтому мы настроим демонстрационный обработчик кликов. В этом обработчике мы будем вызывать метод stopEvents Это позволяет мне показать, что все обработчики событий были удалены, как мы и собирались.

Теперь давайте добавим обработчик функции щелчка к компоненту:

 actions: {
  stopEvents: function () {
    this.get('jquerypic').stop();
  }
}

Затем добавьте тег абзаца в шаблон компонента, как показано ниже:

 <p {{action "stopEvents"}} >
  Stop Events
</p>

При щелчке по этому тегу вызывается действие stopEvents После нажатия на абзац плагин больше не должен реагировать на события клика. Чтобы снова включить события, вы должны инициализировать плагин, как мы это делали в didInsert

В этом последнем разделе мы завершили наш простой компонент Ember. Поздравляем!

Выводы

В этом уроке вы увидели, что плагины jQuery все еще играют жизненно важную роль в нашей карьере. Благодаря мощным API и доступным средам JavaScript очень полезно знать, как объединить два мира вместе и заставить их работать в гармонии.

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

Еще раз хочу напомнить, что код доступен на GitHub .

Используете ли вы плагины jQuery в своих приложениях Ember? если вы хотите обсудить их, не стесняйтесь комментировать в разделе ниже.