Angular.js
Светлая и тёмная сторона
http://bit.ly/13ojf97
$ whoami
Mark Zubovsky
UI/UX, frontender, backender
— Недавнее —
Co-founder @ bombermine.com
Product, UI, Frontend (HTML5 stack, Angular.js),
Backend (Node.js, MySQL, Redis)
Frontender @ makeprogress.ru
Frontend (HTML5 stack, Angular.js)
Светлая сторона
Светлая сторона
-
MVC / MVW
-
2-way data-binding
-
Dirty-check loop ($digest cycle)
-
Dependency Injection
(built-in: $http, $resource, $q, $route etc.) -
Modules, Factories, Directives
-
Расширенный HTML
-
Enterprise-level тестирование
-
Популярность
-
Коммьюнити, поддержка Google
2-way data-binding
<input ng-model="data.name">
<p>Hello {{data.name}}!</p>
app.controller('MyCtrl', function($scope) { $scope.data = {name: 'Mark'}; });
Dirty-check loop
$rootScope.$apply()
-> $childScope
-> $childScope
-> $childScope
Dependency Injection
(built-in: $http, $resource, $q, $route etc.)
Свои сервисы: factory, service, provider
Расширенный HTML
<page> <tabs> <tab title="View"> <calendar></calendar> <select2 opts="config.select2.countries"></select2> // ... </tab> <tab title="Settings"> // ... </tab> </tabs> </page>
Популярность
GitHub Top ★ ( JS )
Angular | ~13K |
Backbone | ~16K |
Ember | ~8K |
Knockout | ~4K |
Коммьюнити, поддержка Google
Тёмная сторона
Тёмная сторона
Very opinionated
Мало туториалов, мало примеров в оф. документации
Dirty-check loop ($apply / $digest)
Тормоза при кол-ве $watchers > 2000
Factory vs Service vs Provider
Неочевидности
Dirty-check loop
Бюджет по времени, в идеале до 16.7мс
Блокирующая операция
Луп проходит по всем скоупам и вотчерам
$scope.$apply === $rootScope.$apply
$scope.$digest — пройтись только по текущему скоупу и дочерним. Лучше не использовать.
$watchers > 2000
Решение:
Перепроектировать UI
(разделение информации на несколько блоков)
Использовать bindonce
Свет в конце туннеля — ES6 Object.observe
Ускорение 20x—40x (пруф)
(уже в Chrome stable v29)
Неочевидности
Есть элемент в DOM с контроллером, значит он работает.
(ng-show/hide не удаляют контроллер)
Использовать объект как модель
(data = {}, но не data = '' // примитивы)
При обёртке внешних плагинов через директивы, не забывать удалять вручную доп. элементы, эвенты и т.п.
app.directive('MyCalendar', function() { return { restrict: 'A', link: function (scope, elem, attrs) { // ... elem.attachMyJQueryCalendar(); scope.$on('$destroy', function() { elem.detachMyJQueryCalendar(); }); } } });
Полезные ссылки
Спасибо за внимание
И да пребудет с вами Сила
demark @ habrahabr
mark@tematico.ru
Angular.js: Light and Dark sides
By demark
Angular.js: Light and Dark sides
- 1,212