Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Angular JS

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for TriLan TriLan
April 11, 2014

Angular JS

Avatar for TriLan

TriLan

April 11, 2014
Tweet

More Decks by TriLan

Other Decks in Programming

Transcript

  1. • Рассказать о личном опыте использования клиентских MV*-фреймворков (на примере

    AngularJS) • Объяснить преимущества перехода на AngularJS при написании сложных сайтов и веб-приложений Цели доклада
  2. • Для опытных веб-разработчиков, которые по каким-то причинам ещё не

    используют современные клиентские MV*-фреймворки • Для новичков в веб-программировании • Для тех, кто использует другие клиентские веб-фреймворки и пока ещё не пользовался AngularJS Для кого
  3. • О сравнении AngularJS с другими клиентскими MV*- фреймворками •

    О прекрасном встроенном механизме роутинга • О большом количество встроенных сервисов • О крупном сообществе • О впечатляющих возможностях тестирования • О многих других вещах, которые вы можете узнать из скринкастов и статей в интернете О чём не пойдёт речь
  4. • О ключевых возможностях AngularJS с примерами кода • О

    том, как значительно использование AngularJS упрощает разработку клиентской части и даже изменяет парадигму мышления программиста • Также я приведу достаточно сложный реальный пример, в котором использование AngularJS упростило жизнь • И попытаюсь очертить круг ситуаций, оказавшись в которых разработчикам следует подумать об использовании AngularJS О чём пойдёт речь
  5. • Декларативный HTML • MVC • Two-way data binding •

    Observables • Maintained by Google (future browsers, нативная поддержка) • Сервисы (DI) • Директивы • $rootScope 1. Возможности
  6. 1.1. Декларативный HTML <div ng-controller="AwesomeCtrl"> <input type="text" ng-model="username" /> <p>{{

    username | uppercase }}</p> <button ng-click="addUsername()">Add</button> <ul> <li ng-repeat="user in users | orderBy:'name'"> {{ user.name }} </li> </ul> </div> var awesomeApp = angular.module('AwesomeApp', []); awesomeApp.controller('AwesomeCtrl', function($scope) { $scope.users = []; $scope.addUsername = function() { $scope.users.push({ 'name': $scope.username }); $scope.username = ""; } });
  7. 1.2. MVC <div ng-controller="AwesomeCtrl"> <input type="text" ng-model="username" /> <p>{{ username

    | uppercase }}</p> <button ng-click="addUsername()">Add</button> <ul> <li ng-repeat="user in users | orderBy:'name'"> {{ user.name }} </li> </ul> </div> var awesomeApp = angular.module('AwesomeApp', []); awesomeApp.controller('AwesomeCtrl', function($scope) { $scope.users = []; $scope.addUsername = function() { $scope.users.push({ 'name': $scope.username }); $scope.username = ""; } }); VIEW CONTROLLER
  8. 1.3. Two-way data binding <div ng-controller="AwesomeCtrl"> <input type="text" ng-model="username" />

    <p>{{ username | uppercase }}</p> <button ng-click="addUsername()">Add</button> <ul> <li ng-repeat="user in users | orderBy:'name'"> {{ user.name }} </li> </ul> </div> var awesomeApp = angular.module('AwesomeApp', []); awesomeApp.controller('AwesomeCtrl', function($scope) { $scope.users = []; $scope.addUsername = function() { $scope.users.push({ 'name': $scope.username }); $scope.username = ""; } });
  9. 1.4. Observables var awesomeApp = angular.module('AwesomeApp', []); awesomeApp.controller('AwesomeCtrl', function($scope) {

    $scope.users = []; $scope.addUsername = function() { $scope.users.push({ 'name': $scope.username }); $scope.username = ""; }; $scope.$watch('username', function(newValue, oldValue) { console.log(newValue); }); }); CONTROLLER
  10. 1.5. Maintained by Google • Надёжная команда • Качественный код

    • Тесная связь с разработчиками ведущего браузера • Шаблоны, основанные на DOM-объектах, будут нативно поддерживаться в Chromium
  11. 1.6. Сервисы • Не веб-сервисы, а SOA • Модульность •

    Повторное использование • SRP (SOLID) • Внедрение через DI var myApp = angular.module('MyApp', []); myApp.factory('fileService', function() { var factory = {}; factory.sendFiles = function(files, url) { // ... }; return factory; }); myApp.controller('MyCtrl', function($scope, fileService) { var files = ...; fileService.sendFiles(files, url); });
  12. 1.7. Директивы • Расширение словаря HTML • Обособленный функционал •

    Повторное использование • Передача параметров из контроллеров • Хранение шаблонов в отдельных файлах <div ng-controller="AwesomeCtrl"> <image-viewer images="photosArray" edit-mode="true" /> </div>
  13. 1.8. $rootScope • Общий scope между контроллерами в пределах одного

    приложения • Позволяет отображать одни и те же данные в разных формах без дублирования информации и возможной потери синхронности <div ng-controller="AwesomeCtrl"> <image-viewer images="$root.photosArray" edit-mode="true" /> </div>
  14. 2. Парадигма • Минимальные усилия по «оживлению» вёрстки • Данные

    и отображение гарантированно синхронизированы • Конечный автомат (машина состояний) • Нет хрупкости кода, нет повтора кода (id, ненужные классы) • Позволяет сфокусироваться на бизнес-логике, а не на навешивании data-атрибутов и callback'ов • Любое действие максимально просто и в коде выглядит максимально лаконично (CoffeeScript не нужен)
  15. 3. Пример использования <div class="slider-control-next" ng-show="photos.length > 1" ng-class="{ 'slider-control-next-active':

    isNextArrowActive() }" ng-click="showNextPhoto()" ng-mouseenter="isNextArrowEntered = true" ng-mouseleave="isNextArrowEntered = false" ng-style="{ 'cursor': isNextArrowActive() ? 'pointer' : 'default' }"> </div> <div ng-controller="PhotoController"> <image-viewer photos="photos" upload-photo-url="{{ path("rent_upload_photo") }}" remove-photo-url="{{ path("rent_remove_photo") }}" set-photo-as-main-url="{{ path("rent_set_photo_as_main") }}" change-photo-comment-url="{{ path("rent_change_photo_comment") }}" photo-upload-mode="photoUploadMode" photo-edit-mode="photoEditMode"> </image-viewer> </div>
  16. Выводы • AngularJS отлично подходит для разработки современных веб-приложений •

    Минимум кода — максимум результата • Прост для первоначального ознакомления, но требует достаточно серьёзных архитектурных познаний для грамотного и полноценного использования • Изменяет парадигму мышления программиста за счёт использования лучших практик • В мире AngularJS есть ещё много всего интересного :)