понедельник, 28 октября 2013 г.

AngularJS: Введение и пример Hello World

AngularJS – это javascript фреймворк, который разработан и поддерживается Google и за последние несколько месяцев стал чрезвычайно популярным. Этот фреймворк разработчики не только любят но и не могут остановится восхвалять его.
Причина этому проста – AngularJS завлекает.
Если у вас есть опыт использования JQuery  и вы попытаетесь изучить Angular, вы будете просто впечатлены фреймворком. Просто поразительно, как много вы можете сделать всего лишь несколькими строчками кода AngularJS. Мы помним фреймворк JQuery делал тоже самое, когда только появилась на свет в далеком 2006 году. Разработчки привыкли писать сотни или даже тысячи строк кода на чистом JavaScript только для того, что бы заставить требуемую логику работать на различных браузерах. JQuery изменила эту парадигму с помощью селекторов, кастомных событий и анимации.
С развитием веба, развиваются и веб-технологии. Браузеры становятся все быстрее и быстрее изо дня в день. Сейчас просто нету смысла рендерить полностью HTML страницу на серверной стороне – браузер делает это точно также. С повсеместным применением AJAX все больше и больше страниц генерируются динамически. Началась новая волна одностраничных приложений (SPASingle Page Applications) – которая ведет к увеличению использования различных front-end фреймворков, таких как Backbone, Knockout, Ember, Angular.
Возвращаясь к AngularJS, я хотел бы начать серию статей которые описывают Angular в простой доступной форме. Любой разработчик, который имеет представление о основах JavaScript и HTML, может начать использовать AngularJS прямо сейчас безо всяких промедлений.
Итак двайте погрузимся в мир AngularJS.

Введение в AngularJS

AngularJS если можно так сказать – супергероический JavaScript MVW фреймворк. Он помогает создавать одностраничные приложения. Его цель  - добавить в браузерные приложения поддержку MVC (ModelView - Controller), что сделает и процесс разработки и процесс отладки проще.
AngularJS выводит декларативное программирование на новый уровень. Он адаптирует и расширяет традиционный HTML возможностью генерации динамического контента посредством двухсторонней привязки данных, делающего возможным автоматическую синхронизацию моделей и представлений.

MVWModel View Whatever

Существует большое количество программных архитектурных паттернов, которые разделяют представление информации от взаимодествия с ней пользователя. Центральная идея подобных паттернов – разделение логики и возможность повторного использования кода. Наиболее известными представителями данного семейства паттернов который получил широкое применение – MVC или Model-View-Controller. Есть другой паттерн, похожий на MVC, который называется MVPModel-View-Presenter. MVP основан на MVC, а Presenter в данном случае является некоторым промежуточным звеном (подобная роль в MVC принадлежит котроллеру). В MVP вся логика представления отдана на откуп объекту Presenter, а объект Model конечном счете становится просто бизнес-моделью без дополнительных возможностей и полномочий.  Существует еще одна варианция паттерна MVVM или Model-View-ViewModel.
Для Angular на самом деле безразлично какую вариацию паттерна вы будете использовать в своем приложении, поэтому данный паттерн можно назвать MVW – или Model-View-Whatever (whatever – что угодно). Основная концепция MVW – все определения связаны с именованым Модулем. Позже Модули могут объединятся в завершенную форму веб приложений. Модули могут зависеть друг от друга, таки образом включение модуля в ваше приложение потребует включения и других зависимых модулей. AngularJS предоставляет богатый набор API для объявления модулей и связывания их вместе посредством dependency injection (внедрение зависимостей – паттерн объединения отдельных модулей системы в одно целое). Мы увидим это более подробно в последующих статьях.

Простейший пример, AngularJS

Перед тем как приступить к теории, давайте взглянем на реальный код Angular. Это позволит на понять как обстоят дела на самом деле.
Для написания примера на Angular, все что нам нужно – это подключить библиотеку Angular JS в наш HTML документ.
<script type="text/javascript"
        src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
Отлично, теперь определим нашу таблицу как показано ниже.
<!DOCTYPE html>
<html ng-app>
<head>
    <title>Hello World, AngularJS - ViralPatel.net</title>
    <script type="text/javascript"
        src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>

</head>
<body>
     
    Write some text in textbox:
    <input type="text" ng-model="sometext" />

    <h1>Hello {{ sometext }}</h1>
     
</body>
</html>
Если вы хотите поменять что то и поэкспериментировать с кодом, это можно следать в JSFiddle: http://jsfiddle.net/viralpatel/vFcZ7/
Просто напишите какой-нибудь текст в демо и посмотрите как меняется значение после слова “Hello”.
Обратите внимание что мы не написали ни строчки JavaScript кода, а пример все равно работает. Мистика! Давайте теперь попробуем разобрать пример строчка за строчкой. Мы поместили в HTML документ несколько тегов относящихся к Angular.
ng-app
Первую вещь на которую следует обратить внимание – это аттрибут ng-app внутри тега <html>. Этот аттрибут говорит фреймворку Angular, что внутри данного тега будут использоваться конструкции Angular. То есть в нашем случае Angular будет использоваться во всем документе. Если вы хотите разрешить использование Angular в каком то конкретном месте вашей веб-страницы то вы можете задать аттрибут ng-app только для требуемого <div> или иного тега.
Если вы используете IE7 – добавьте конструкцию вида id=”ngapp. Например:
<html ng-app id="ng-app">
Если вы используете такой синтакс, вам кроме этого следует добавить xml-неймспейс в html. Это сделает ваш IE счастливым.
<html xmlns:ng="http://angularjs.org">
ng-model и двухсторонняя привязка данных
Мы задали аттрибут ng-model в текстбоксе как ng-model=”sometext. ng-model привязывает состояние текстбокса к значению модели. В нашем случае мы определили модель sometext. Значение этой модели привязано к состоянию текстбокса с помощью аттрибута ng-model. Таким образом, когда значение в текстбоксе изменится, Angular автоматически обновит значение в модели sometext. Это называется двухсторонней привязкой данных. Аналогичным образом, если мы изменим значение в модели, Angular обновит в соответствии с нашими изменениями значение текстбокса. Двухсторонняя привязка данных – ключевая магия Angular. Это просто работает. Вы узнаете о данной функциональности более подробно как только мы начнем усложнять наш пример.
Двухсторонняя привязка данных AngularJS – наиболее значимая особенность фреймворка, которая уменьшает количество кода, которое требуется написать для реализации подобной функциональности.
{{ sometext }}
Обратите внимание как мы выделяем использование нашей модели с помощью двойных фигурных скобок. Этот синтаксис говорит фреймворку привязать значение модели sometext к месту определения {{ sometext }}.
Таким образом, любое изменение значения модели sometext приведет к изменению текста в теге <h1>.
ng-show / ng-hide
Теперь давайте пойдем немного дальше и внесем в пример небольшое изменение – добавим еще один аттрибут Angularng-show. В коде представленом ниже мы добавили аттрибут ng-show=”sometext в тег h1.
<script type="text/javascript"
        src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
Это единственное изменение, и вот что мы получили.
<!DOCTYPE html>
<html ng-app>
<head>
    <title>Hello World, AngularJS - ViralPatel.net</title>
    <script type="text/javascript"
        src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>

</head>
<body>
     
    Write some text in textbox:
    <input type="text" ng-model="sometext" />

    <h1 ng-show="sometext">Hello {{ sometext }}</h1>
     
</body>
</html>
Если вы хотите поэкпериментировать с обновленным кодом, это можно сделать  в JSFiddle: http://jsfiddle.net/viralpatel/ppgsS/
В данном примере, текст Hello не появится до тех пор пока в текстбоксе не будет введен текст. Мы добавили только один маленький аттрибут в тег h1 и посмотрите как изменилась функциональность!
Аттрибут ng-show показывает элемент, в зависимости от значения булевого выражения. Подобно ng-show другой  аттрибут ng-hide – делает все также, но в точности наоборот. 
Обратите внимание, мы до сих пор не написали ни строчки кода на JavaScript, а наше приложение уже стало таким динамичным.

AngularJS Filters

Фреймворк AngularJS предоставляет эффективный механизм модификации данных с использованием так называемых фильтров. Фильтры, как правило, преобразуют один вид данных в другой и выполняют некоторое форматирование. Общий синтаксис использования фильтров можно представить в такой форме:
{{ expression | filter }}
Вы можете использовать несколько фильтров одновременно, создавая цепочку фильтров:
{{ expression | filter1 | filter2 }}
По умолчанию AngularJS предоставляет небольшой набор встроеных фильтров которые мы может использовать в нашем приложении. Также можно определить свой собственный фильтр. Для начала давайте посмотрим как работают встроенные фильтры.

Фильтры uppercase and lowercase

Как можно догадаться из имени, фильтры переводят выражение в верхний и нижний регистры соответствено. Давайте рассмотрим небольшой пример. Для этого внесем небольшие изменения в наш пример – добавим использование фильтра uppercase.
<!DOCTYPE html>
<html ng-app>
<head>
    <title>Hello World, AngularJS - ViralPatel.net</title>
    <script type="text/javascript"
        src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
  
</head>
<body>
      
    Write some text in textbox:
    <input type="text" ng-model="sometext" />
  
    <h1>Hello {{ sometext }}</h1>

    <h4>Uppercase: {{ sometext | uppercase }}</h4>
    <h4>Lowercase: {{ sometext | lowercase }}</h4>
      
</body>
</html>
Если вы хотите изменить что то или посмотреть как это работает обратитесь к коду доступному в JSFiddle: http://jsfiddle.net/viralpatel/nZ5sH/
Обратите внимание что когда вы набираете текст в текстбоксе, введенное значение преобразуется к верхнему или нижнему регистру в зависимости от использоуетмого фильтра.
Кроме рассмотренных выше фильтров, Angular имеет в своем арсенале следующие фильтры:
date
{{ date_expression | date[:format] }}
Форматирует дату в строку заданного формата. Обратитесь к документации Angular  за подробностями форматирования.
number
Использование:
{{ number_expression | number[:fractionSize] }}
Преобразует число в строку заданного формата. Если значение не число - возвращает пустую строку.
Кроме того существуют другие фильтры, такие как json, limitTo, filter, orderBy. Мы вскользь коснемся их использования в последующих статьях. Сейчас же за подробностями обращайтесь к документации Angular по фильтрам.

Вот и все

Мы только что прикоснулись к поверхности большого океана. Фреймворк AngularJS предоставляет намного больше, чем мы можем ожидать с первого взгляда.
В данной публикации мы познакомились с самыми простейшими возможностями AngularJS и рассмотрели как подготовить окружение нашей страницы для работы с Angular. Кроме того мы рассмотрели различные аттрибуты, такие как ng-app, ng-model, ng-show и т.д. и рассмотрели как ими пользоваться. После этого мы познакомились с фильтрами и рассмотрели их работу на примере фильтров uppercase и lowercase.