Стартуем с Ember.js: следующий шаг (часть 2)
В предыдущей части данного цикла статей мы рассмотрели основы Ember.js. Сегодня мы сделаем следующий шаг, чтобы лучше понять фрэймворк и многие фишки, которые помогут нам создавать одно-страничные приложения.
Простое приложение
Для начала нам нужно скачать и подключить к странице все нужные файлы для работы Ember. Как я говорил в прошлой статье, найти все нужные файлы можно на Github.
Самое интересное, что скачанные нами файлы - это классный пример для того, чтобы понять Ember. Давайте взглянем на них. В специфику мы нырнём чуть позже. Сначала, вам нужно понять общие принципы функционирования фрэймворка.
Открыв файл index.html, вы должны увидеть следующее:
Welcome to Ember.js
Ничего сверхъестественного, я знаю. Давайте теперь посмотрим на код. Если вы откроете файл “js/app.js”, то увидите следующее:
App = Ember.Application.create({}); App.IndexRoute = Ember.Route.extend({ setupController: function(controller) { controller.set('content', ['red', 'yellow', 'blue']); } });
Для инициализации приложения следует выполнить следующую строку:
App = Ember.Application.create({});
Это настраивает шаблон по умолчанию, обработчики событий и рутер.
Следующий код отвечает за настройку рутера. В данном примере, для index.html:
App.IndexRoute = Ember.Route.extend({ setupController: function(controller) { controller.set('content', ['red', 'yellow', 'blue']); } });
Рутер использует URL, для того чтобы определить, какое состояние приложения нужно отобразить пользователю.
На данный момент, срабатывает рутер по умолчанию, но его можно также задать явно:
App.Router.map( function() { this.resource( 'index', { path: '/' } ); // Переносит нас на "/" });
Данный код определяет корневой URL нашего приложения. В дальнейшем, мы более подробно рассмотрим работу с рутером.
Давайте вернёмся к следующему коду:
App.IndexRoute = Ember.Route.extend({ setupController: function(controller) { controller.set('content', ['red', 'yellow', 'blue']); } });
В случае, если пользователь направится в корень нашего приложения, Ember настроит контроллер, который загружает в приложение контент, доступный по ключу content. В дальнейшем, по этому ключевому слову мы сможем доставать эти данные в других частях приложения. Теперь давайте посмотрим, что происходит в index.html:
<script type="text/x-handlebars" data-template-name="index"> <h2>Welcome to Ember.js</h2> <ul> {{#each item in model}} <li>{{item}}</li> {{/each}} </ul> </script>
Это пример использования шаблонизатора Handlebars, для вывода данных на страницу приложения. Ember считывает атрибуты data-*, и в зависимости от этого, вызывает соответствующий контроллер с данными.
В конце прошлой статьи я писал о важности правил именования ресурсов Ember для упрощения работы. Если вы взгляните на код выше, то увидите, что в данном примере вызывается шаблон index (в атрибуте data-template-name). Благодаря этому названию, Ember определяет, какой рутер нужно запустить, т.к. их имена совпадают. Название рутера “IndexRoute”, а внутри определён контроллер:
App.IndexRoute = Ember.Route.extend({ setupController: function(controller) { controller.set('content', ['red', 'yellow', 'blue']); } });
В контроллере создаётся источник данных под ключевым словом content, куда мы помещаем массив, состоящий из 3х строк. Как правило, в этом контексте, массив - это модель.
Правильное именование помогает Ember подключаться к нужным ресурсам (к контроллерам с моделью). Именно поэтому при выводе данных в шаблоне можем пользоваться как ключевым словом content, так и model:
{{#each item in model}} <li>{{item}}</li> {{/each}}
Данные строки генерируют код, который вы видите на странице.
Я думаю, что этот демо пример хорошо демонстрирует основы функционирования приложения на Ember. Чем лучше вы поймёте, как взаимодействуют между собой различные компоненты фрэймворка, тем быстрее освоите библиотеку. Теперь давайте начнём всё с нуля, чтобы лучше разобраться в деталях.
Начинаем всё с нуля
Я уже вскользь коснулся главного объекта приложения. В документации есть вся необходимая инфа о том, что происходит при инициализации объекта:
Настройка пространства имён вашего приложения. Все классы превращаются в свойства объекта (пр. App.PostsView и App.PostsController). Это помогает предотвратить всевозможные коллизии;
- Настройка обработчиков событий;
- Автоматическая обработка базового шаблона приложения, на основе которого будут работать другие шаблоны;
- Автоматическая настройка рутера, в зависимости от текущего URL.
Итак, всё выше перечисленное происходит при выполнении команды:
App = Ember.Application.create({});
Прошу заметить, что App - это не ключевое слово в Ember. Это обычная глобальная переменная, определяющая пространства имён. Почему именно App? Потому что множество демо примеров документации используют именно это название. Чтобы после копирования примеров не нужно было что-то переименовывать, сообщество использует название App.
Ember автоматически генерирует изначальные настройки:
// создаёт пространство имён для приложения App = Ember.Application.create({}); // создаёт глобальный рутер App.Router.map( function() {}); // создаёт изначальные настройки рутера App.ApplicationRoute = Ember.Route.extend({}); // создаёт базовый шаблон <script type="text/x-handlebars" data-template-name="application"> {{outlet}} </script>
Теперь давайте поговорим о шаблоне по умолчанию. Почему мы не видим его содержимое? Потому что для этого нужно выставить специальную настройку.
Для определения шаблонов приложения можно использовать тот же синтаксис, что мы видели раньше, но только с одним отличием: имя шаблона указывать не обязательно. Обычный шаблон может быть создан следующим образом:
<script type="text/x-handlebars"> <h1>Application Template</h1> </script>
или так:
<script type="text/x-handlebars" data-template-name="application"> <h1>Application Template</h1> </script>
Если не задать шаблону имя через атрибут data-template-name, то Ember расценит его как шаблон приложения и обработает должным образом.
Если сейчас в файл index.html добавить следующий код:
<script type="text/x-handlebars" data-template-name="application"> <h1>Application Template</h1> {{outlet}} </script>
то заголовок появится на странице. Маркер {{outlet}} будет заменён на вывод отдельного шаблона страницы. Базовый шаблон позволяет создать общее оформление разным состояниям вашего приложения: шапку, подвал и так далее.. Добавив базовый шаблон в index.php, вы словно говорите Ember действовать следующим образом:
- Автоматически обработать шаблон приложения;
- Заменить {{outlet}} на содержимое шаблона текущей страницы;
- Обработать и вывести содержимое шаблона index.
Тут главное создать базовый шаблон. Обо всём остальном Ember позаботится сам. Именно это делает эту библиотеку такой мощной.
Настройка рутера
Понять, как работать с рутором, очень важно, ведь это ключевая часть Ember. Для того, чтобы отслеживать навигацию по приложению, нужно создать специальный метод. Тут-то и понадобятся знания о том, как настроить рутер.
Объекты рутера определяют, какие ресурсы нужно отобразить при навигации по приложению.
Взгляните на js/app.js, и вы найдёте код создания рутера для начальной страницы:
App.IndexRoute = Ember.Route.extend({ setupController: function(controller) { controller.set('content', ['red', 'yellow', 'blue']); } });
Однако самого объекта тут нет. Ember сам создаст его, в случае необходимости. Для начальной страницы это будет выглядеть примерно так:
App.Router.map( function() { this.resource( 'index', { path: '/' } ); });
Данный код означает, что Ember создаёт маршрут для главной страницы, и в случае, если пользователь на неё зашёл, будет вызван маршрут index (IndexRoute). Вот почему многое работает на автопилоте. По слову index, Ember будет искать опцию для маршрута IndexRoute. При создании данного маршрута мы указали контроллер с данными.
Поскольку Ember использует URL для определения состояния приложения, которое нужно отобразить пользователю, для каждого из них нужно создать свой маршрут. Представьте, что у нас есть следующие страницы:
- Аккаунт: (URL: /account)
- Профиль (URL: /profile)
- Галерея (URL: /gallery)
В каждый из этих секций будет подгружаться собственная пачка данных. Для создания обработчика маршрутов необходимо воспользоваться методом resourse():
App.Router.map( function() { this.resource( 'accounts' ); this.resource( 'profiles' ); this.resource( 'gallery' ); });
Данный код поможет Ember понять структуру вашего приложения, и в зависимости от этого, правильно управлять ресурсами. Теперь нам необходимо создать сами маршруты следующего вида:
App.GalleryRoute = Ember.Route.extend({ setupController: function(controller) { controller.set('content', ['pic-1.png', 'pic-2.png', 'pic-3.png']); } });
Теперь при навигации на “/gallery”, Ember.js инициирует объект GalleryRoute, настраивает контроллер с данными и рендерит шаблон. Всё это происходит на автомате, благодаря правильному именованию ресурсов.
Также у вас есть возможность использовать сложные url вида: /account/new
В этом случае, настройка рутера будет выглядеть так:
App.Router.map( function() { this.resource( 'accounts', function() { this.route( 'new' ); }); });
В этом фрагменте, внутри метода resource(), происходит дополнительная надстройка маршрута с помощью route(). В этом случае, Ember сначала убедится в наличии ресурса accounts и обработает шаблон accounts. Затем будет уже обрабатывать ресурсы для шаблона accounts.new.
Также можно создавать ещё более сложные структуры:
App.Router.map( function() { this.resource( 'accounts', function() { this.route( 'new' ); this.resource( 'pictures', function() { this.route( 'add' ); }); }); });
Итог
Надеюсь, у вас теперь сложится более полное впечатление о работе с Ember. В следующей статье мы продолжим расширять наши познания в этом прикольном фрэймворке!
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/QuZDJ4bLsJo/lessons.php
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-11-26 » Капитан грузового судна, или Как начать использовать Docker в своих проектах
- 2024-11-26 » Обеспечение безопасности ваших веб-приложений с помощью PHP OOP и PDO
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-15 » Перенос сайта на WordPress с одного домена на другой
- 2024-11-08 » OSPanel 6: быстрый старт
- 2024-11-08 » Как установить PhpMyAdmin в Open Server Panel
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
Все мы сидим в сточной канаве, но некоторые при этом смотрят на звезды Уайльд Оскар - (1854-1900) - английский писатель |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.