Статьи

Создание компонентов в Angular 2 с Typescript и ES5

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

По мере приближения года команда Angular как никогда близка к выпуску стабильной версии Angular 2.0. Это изменит способ разработки приложений Angular, но в лучшую сторону. В этой статье я собираюсь показать вам некоторые основные концепции Angular 2.0 и то, как их можно использовать. В частности, я собираюсь провести вас через процесс создания компонента в Angular 2 от начала до конца. Сначала мы подробно рассмотрим, как это делается с помощью TypeScript , затем мы перенесем наш угловой компонент, чтобы он работал с использованием простого ES5.

Код этого руководства можно найти в нашем репозитории GitHub . Репо имеет две ветви: одну для версии TypeScript и одну для версии ES5. Если вы хотите клонировать определенную ветку, используйте git clone <url> --branch <branch>

Что такое компонент?

Использование компонентов в JavaScript значительно увеличилось за последние месяцы. Они используются в таких проектах, как React , Knockout , Ember и т. Д., Поэтому неудивительно, что Angular включил их в версию 2.0. Модульность кода всегда была тем, на чем фокусировалась команда Angular, и использование компонентов подчеркивает это, поскольку они позволяют нам разбивать наш код на инкапсулированные части.

Но что такое компонент? Ну, по сути это немного кода, который можно повторно использовать в приложении. Он состоит из двух вещей: представление и некоторая логика. Используя акцент, который команда разработчиков Angular сделала на компонентах, мы можем использовать некоторые довольно мощные функциональные возможности. Angular 2 позволяет невероятно легко создавать динамические приложения, состоящие из различных компонентов, которые заимствованы из директив в качестве главного элемента инфраструктуры. В Angular 2 директивы являются легкими компонентами, и они просто используются для добавления некоторых функций в DOM. Теперь разработчикам Angular не нужно беспокоиться о том, чтобы испортить приложение из-за конфликтующих проблем, связанных с isolate $scope Вместо этого использование компонентов — это способ гарантировать, что наш код из одного раздела приложения не будет мешать этому из другого.

Машинопись

Angular 2.0 был создан для использования TypeScript , который является расширенным набором JavaScript. Разработчики Angular потратили огромное количество времени, работая над этим выпуском. Они работали над оптимизацией производительности как по скорости страницы, так и по автоматизации рабочего процесса. TypeScript подобен другим транспортерам кода и позволяет разработчикам писать код, который можно легко преобразовать в действительный JavaScript. При этом он становится все более популярным, особенно в течение прошлого года, поэтому команда Angular решила создать фреймворк, используя его .

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

Ниже мы видим пример, который я вытащил из статьи TJ Van Toll The Rise of TypeScript . Внутри этой функции мы видим, что параметры heightwidthnumber Число : numbernumber В результате, все, что передано в эту функцию, но не число, приведет к тому, что компилятор выдаст ошибку во время компиляции.

 function calculateArea( height: number, width: number ) : number {
  return height * width;
}
console.log(calculateArea(2,3));
//Will work just fine

console.log(calculateArea("Ten", "Eleven"));
//Argument of type 'string' is not assignable to parameter of type 'number'.

Объявления типов помогают нам документировать наши API и делают наш код более понятным с течением времени.

Установка

Процесс компиляции TypeScript в JavaScript чрезвычайно прост. Сначала возьмите пакет TypeScript из npm:

 npm install -g typescript

После установки компиляция TypeScript в JavaScript так же просто, как выполнение следующей команды из командной строки (файлы TypeScript сохраняются с использованием расширения .ts

 tsc <filename.ts>

Теперь давайте посмотрим, как Angular 2 использует возможности TypeScript для простого создания пользовательских компонентов. Код для нашего первого примера можно найти в ветке TypeScript нашего репозитория GitHub.

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

Поскольку TypeScript — это расширенный набор JavaScript, любой допустимый JavaScript будет отлично работать в файлах .ts Используя TypeScript, разработчики могут расширить свой код JavaScript для использования новейших функций ES6. В этом примере мы будем использовать классы.

Ниже я создал компонент, используя код TypeScript. Первое, что я сделал, это импортировал Angular с использованием синтаксиса ES6 . В этом примере мы собираемся определить компонент, а также представление для компонента. После этого нам понадобится функция bootstrap Внутри этого кода мы увидим символ @

 import {Component, View, bootstrap} from 'angular2/angular2';
@Component({
  selector: 'user-name'
})

Поскольку Angular 2 был построен поверх TypeScript, фреймворк распознает нашу аннотацию @Component Кроме того, он сообщает Angular, что мы хотим создавать экземпляр компонента всякий раз, когда он видит <user-name></user-name>

Как упоминалось выше, компонент состоит из двух вещей:

  • Вид
  • Немного логики

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

Сразу после нашего компонента мы можем добавить некоторый код TypeScript для определения нашего представления. Давайте посмотрим на продолжение приведенного выше кода и увидим из первых рук, насколько просто Angular облегчает процесс добавления представлений к пользовательским компонентам:

 @View({
  template: '<h1>My name is Tom Greco</h1>'
})
class UserComponent { }

Теперь, когда я добавлю <user-name></user-name> При этом логическая часть нашего компонента пуста, так как наш класс UserComponent

В приведенном выше примере у меня просто пустой класс. Теперь, однако, я собираюсь создать переменную namename

 @View({
  template: '<h1>My name is {{ name }}</h1>'
})
class UserComponent {
  name: 'Tom Greco'
}
bootstrap(UserComponent);

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

Еще одна вещь, которую я хочу быстро отметить, это то, что наше приложение должно просматриваться с использованием какого-либо сервера, чтобы оно отображалось правильно. Если к нему обратиться напрямую, то System.js не сможет загрузить наш main

Те, кто использует репозиторий для этого примера, теперь могут запустить node app.js После запуска этой команды мы можем увидеть наш компонент в действии, посетив http: // localhost: 8000 . Надеюсь, это демонстрирует, насколько просто Angular делает добавление логики в компонент!

Перенос нашего компонента в ES5

Для тех, кто хочет использовать возможности 2.0 с ES5, команда Angular 2 создала версию фреймворка, которую можно просто добавить на веб-сайт. Это необходимо, потому что ES5 не имеет модульной системы, поэтому нам нужен какой-то самодельный пакет. Если вы проверили код для первого примера , вы увидите, что мне нужно было добавить три разных тега скрипта в приложение. В этом примере все, что нам нужно сделать, это добавить скрипт ниже.

 <script src="http://code.angularjs.org/2.0.0-alpha.30/angular2.sfx.dev.js"></script>

С помощью этого сценария разработчики могут использовать свои знания ES5, и им не нужно беспокоиться о том, чтобы пожертвовать какой-либо функциональностью платформы. Давайте посмотрим, как мы можем создать угловой компонент в ES5. Код для этого примера можно найти на ветке ES5 нашего репозитория GitHub . Тем не менее, давайте начнем!

Чтобы воссоздать компонент, используя ES5 вместо TypeScript, я собираюсь использовать несколько различных методов. По сути, это то же самое, что я делал в приведенном выше примере, однако вместо использования символа @ng Это показано в коде ниже:

 var UserComponent = ng.Component({
  selector: 'user-name'
})

Теперь мы можем продолжать добавлять функциональность в наш компонент, который будет отображаться каждый раз, когда наше приложение читает селектор <user-name>

Давайте воспользуемся методами ViewClass Внутри нашего метода View Поскольку классы не поддерживаются в ES5, мы собираемся имитировать их использование в нашем методе Classname

 .View({
  template: '<h1>My name is {{ name }}</h1>'
})
.Class({
  constructor: function(){
    this.name="Tom Greco";
  }
});

Мы упускаем одну вещь, хотя. В нашем примере TypeScript мы использовали функцию bootstrap Вот как мы можем сделать то же самое в ES5:

 <script>
  document.addEventListener('DOMContentLoaded', function () {
    angular.bootstrap(UserComponent);
  });
</script>

Это должно быть размещено ниже нашего пользовательского кода приложения. Это заставит Angular загрузить наше приложение и загрузить компонент после загрузки страницы. В отличие от нашего предыдущего примера (для которого требовался сервер), эту страницу можно просматривать прямо в браузере.

Как видите, команда Angular предоставила четкое решение для тех, кто хочет создавать приложения в 2.0 с использованием ES5. Если это то, что вас интересует, я настоятельно рекомендую вам воспользоваться библиотекой a.js , которая позволяет разработчикам создавать приложения Angular в ES5 с использованием синтаксиса, вдохновленного TypeScript.

Вывод

Надеюсь, это дало вам представление о различных аспектах Angular, которые появятся в следующей версии фреймворка. Если вы хотите пойти дальше и создать полноценное приложение, используя Angular 2 и TypeScript (в данном случае это доска объявлений), я рекомендую ознакомиться с этой статьей: Начало работы с Angular 2 с использованием TypeScript .

Я также хотел бы услышать о вашем опыте с Angular 2. Вы уже пробовали это? Вы создали что-то, чем хотели бы поделиться? Дай мне знать в комментариях.