- PVSM.RU - https://www.pvsm.ru -
AngularJS создан для тех разработчиков, которые считают, что декларативный стиль лучше подходит для создания UI, а императивный — для написания бизнес-логики.
AngularJS представляет собой комплексный фреймворк. В стандартной поставке он предоставляет следующие возможности:
AngularJS разрабатывается сотрудниками Google и используется, как минимум, в одном сервисе Google — DoubleClick [2].
Простенькая todo-шка
<div ng-app>
<h2>Todo</h2>
<div ng-controller="TodoCtrl">
<span>{{remaining()}} of {{todos.length}} remaining</span>
[ <a href="" ng-click="archive()">archive</a> ]
<ul class="unstyled">
<li ng-repeat="todo in todos">
<input type="checkbox" ng-model="todo.done">
<span class="done-{{todo.done}}">{{todo.text}}</span>
</li>
</ul>
<form ng-submit="addTodo()">
<input type="text" ng-model="todoText" size="30" placeholder="add new todo here">
<input class="btn-primary" type="submit" value="add">
</form>
</div>
</div>
function TodoCtrl($scope) {
$scope.todos = [
{text:'learn angular', done:true},
{text:'build an angular app', done:false}];
$scope.addTodo = function() {
$scope.todos.push({text:$scope.todoText, done:false});
$scope.todoText = '';
};
$scope.remaining = function() {
var count = 0;
angular.forEach($scope.todos, function(todo) {
count += todo.done ? 0 : 1;
});
return count;
};
$scope.archive = function() {
var oldTodos = $scope.todos;
$scope.todos = [];
angular.forEach(oldTodos, function(todo) {
if (!todo.done) $scope.todos.push(todo);
});
};
}
В действии можно посмотреть на главной странице angularjs.org [3]. Там же представлен еще ряд примеров:
Еще примеры:
На директивах держится практически вся декларативная часть AngularJS. Именно они используются для обогащения синтаксиса HTML. В процессе компиляции DOM директивы берутся из HTML и исполняются. Директивы могут добавить какое-то новое поведение и/или модифицировать DOM. В стандартную поставку входит достаточно большое количество директив для построения веб приложений. Но ключевой особенностью является возможность разработки своих директив, за счет чего HTML может быть превращен в DSL.
Директивы именуются с помощью lowerCamelCase, например, ngBind. При использовании директиву необходимо именовать в нижнем регистре с использованием в качестве разделителя одного из спец символов: :, -, или _. По желанию для получения валидного кода можно использовать префиксы x- или data-. Примеры: ng:bind, ng-bind, ng_bind, x-ng-bind и data-ng-bind.
Директивы могут использоваться как элемент (<my-directive></my-directive>), атрибут (<div my-directive="exp"> </div>), в классе (<div class="my-directive: exp;"></div>) или в комментарии (<!-- directive: my-directive exp -->). Это зависит от того, как конкретная директива была разработана.
Подробнее о директивах в руководстве разработчика [10].
Scope — это объект, имеющий отношение к модели в приложении. Он является контекстом выполнения для выражений. Scope-ы выстраиваются в иерархическую структуру, похожую на DOM. При этом они наследуют свойства от своих родительских scope-ов.
Scope-ы являются как бы «клеем» между контроллером и представлением. В процессе выполнения фазы связывания шаблона директивы устанавливают наблюдение ($watch) за выражениями в рамках scope. $watch дает директивам возможность реагировать на изменения для отображения обновленного значения или каких-либо других действий. И контроллеры, и директивы имеют ссылку на scope, но не имеют ссылок друг на друга. Так контроллеры изолируются от директив и от DOM-а. За счет этого возрастают возможности по тестированию приложения.
Подробнее о scope-ах в руководстве разработчика [11].
Сервисы — singleton-ы, выполняющие какую-либо конкретную задачу, которая является общей для всех или конкретного веб-приложения. Например, $http сервис [12], который является оберткой над XMLHttpRequest. Несколько примеров других сервисов (полный список смотрите в документации [13]):
Для использования сервиса необходимо указать его как зависимость для контроллера, другого сервиса, директивы и т.п. AngularJS позаботится обо всем остальном — создании, разрешении зависимостей и т.п.
Подробнее о сервисах в руководстве разработчика [18].
Фильтры предназначены для форматирования данных перед отображением их пользователю, а также фильтрации элементов в коллекциях. Примеры фильтров (полный список можно посмотреть в документации [13]): currency [19], date [20], orderBy [21], uppercase [22]. Использование фильтров достаточно традиционно: {{ expression | filter1 | filter2 }}
Подробнее о фильтрах в руководстве разработчика [23].
Приложения в AngularJS не имеют основного исполняемого метода. Вместо этого модуль выполняет роль декларативного описания того, как приложение должно быть загружено. Благодаря этому, например, при написании сценариев тестирования можно подгрузить дополнительные модули, которые переопределят какие-то настройки, облегчая тем самым комплексное (end-to-end) тестирование.
Подробнее о модулях в руководстве разработчика [24].
Как пишут разработчики, для тестирования они сделали очень много в AngularJS, поэтому уже ничего не может извинить вас, если вы не будете тестировать свое приложение :)
Пример тестового e2e сценария:
describe('Buzz Client', function() {
it('should filter results', function() {
input('user').enter('jacksparrow');
element(':button').click();
expect(repeater('ul li').count()).toEqual(10);
input('filterText').enter('Bees');
expect(repeater('ul li').count()).toEqual(1);
});
});
Подробнее о модульном тестировании [25] и e2e тестировании [26] в руководстве разработчика.
Это расширение для Chrome [27], которое облегчает отладку AngularJS приложений. Позволяет работать с иерархией scope-ов, дает возможность профилирования приложения, визуализирует зависимости между сервисами, отображает содержимое scope-ов на странице элементов, позволяет выводить и менять значения в scope из консоли. Хорошее текстовое описание на странице в github [27]. Хорошее видео на youtube [28].
Автор: aav
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/12653
Ссылки в тексте:
[1] Шаблон типового приложения: https://github.com/angular/angular-seed
[2] DoubleClick: http://builtwith.angularjs.org/project/DoubleClick
[3] angularjs.org: http://angularjs.org/
[4] mongolab: https://mongolab.com
[5] демо: http://todomvc.com/architecture-examples/angularjs/
[6] код: https://github.com/addyosmani/todomvc/tree/master/architecture-examples/angularjs
[7] todomvc: http://todomvc.com/
[8] builtwith.angularjs.org: http://builtwith.angularjs.org/
[9] AngularUI: https://github.com/angular-ui/angular-ui
[10] Подробнее о директивах в руководстве разработчика: http://docs.angularjs.org/guide/directive
[11] Подробнее о scope-ах в руководстве разработчика: http://docs.angularjs.org/guide/scope
[12] $http сервис: http://docs.angularjs.org/api/ng.$http
[13] документации: http://docs.angularjs.org/api/
[14] $compile: http://docs.angularjs.org/api/ng.$compile
[15] $cookies: http://docs.angularjs.org/api/ngCookies.$cookies
[16] $location: http://docs.angularjs.org/api/ng.$location
[17] $resource: http://docs.angularjs.org/api/ngResource.$resource
[18] Подробнее о сервисах в руководстве разработчика: http://docs.angularjs.org/guide/dev_guide.services.understanding_services
[19] currency: http://docs.angularjs.org/api/ng.filter:currency
[20] date: http://docs.angularjs.org/api/ng.filter:date
[21] orderBy: http://docs.angularjs.org/api/ng.filter:orderBy
[22] uppercase: http://docs.angularjs.org/api/ng.filter:uppercase
[23] Подробнее о фильтрах в руководстве разработчика: http://docs.angularjs.org/guide/dev_guide.templates.filters
[24] Подробнее о модулях в руководстве разработчика: http://docs.angularjs.org/guide/module
[25] модульном тестировании: http://docs.angularjs.org/guide/dev_guide.unit-testing
[26] e2e тестировании: http://docs.angularjs.org/guide/dev_guide.e2e-testing
[27] расширение для Chrome: https://github.com/angular/angularjs-batarang/blob/master/README.md
[28] youtube: https://www.youtube.com/watch?v=q-7mhcHXSfM
[29] коротенькую презентацию: https://docs.google.com/presentation/pub?id=1kDvp3O2xZ6ZSXF4F1YTbg_jy_ei2sFl38f3c6VkBfSo&start=false&loop=false&delayms=3000#slide=id.p
[30] туториал: http://docs.angularjs.org/tutorial/
[31] руководство разработчика: http://docs.angularjs.org/guide/
[32] блоге Lukas Ruebbelke: http://onehungrymind.com/
[33] Journey Through The JavaScript MVC Jungle: http://coding.smashingmagazine.com/2012/07/27/journey-through-the-javascript-mvc-jungle/
Нажмите здесь для печати.