«1. Обзор
В этом кратком руководстве мы узнаем, как использовать RESTful API из простого внешнего интерфейса AngularJS.
Мы собираемся отобразить данные в таблице, создать ресурс, обновить его и, наконец, удалить.
2. REST API
Во-первых, давайте кратко рассмотрим наш простой API — доступ к ресурсу Feed с нумерацией страниц:
-
get paginated — GET /api/myFeeds?page={page }\u0026size={size}\u0026sortDir={dir}\u0026sort={propertyName} create – POST /api/myFeeds update – PUT /api/myFeeds/{id} delete – DELETE /api/myFeeds/{id }
Небольшое замечание: нумерация страниц использует следующие 4 параметра:
-
page: индекс запрошенного размера страницы: максимальное количество записей на странице sort: имя свойства, используемого при сортировке sortDir: направление сортировки ~ ~~ А вот пример того, как выглядит ресурс Feed:
3. Страница Feeds
{
"id":1,
"name":"baeldung feed",
"url":"/feed"
}
Теперь давайте посмотрим на нашу страницу фидов:
Обратите внимание, что мы использовали ng -table для отображения данных — подробнее об этом в следующих разделах.
<script
src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js">
</script>
<script
src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular-resource.min.js">
</script>
<script th:src="@{/resources/ng-table.min.js}"></script>
<script th:src="@{/resources/mainCtrl.js}"></script>
<a href="#" ng-click="addNewFeed()">Add New RSS Feed</a>
<table ng-table="tableParams">
<tr ng-repeat="row in $data track by row.id">
<td data-title="'Name'" sortable="'name'">{{row.name}}</td>
<td data-title="'Feed URL'" sortable="'url'">{{row.url}}</td>
<td data-title="'Actions'">
<a href="#" ng-click="editFeed(row) ">Edit</a>
<a href="#" ng-click="confirmDelete(row.id) ">Delete</a>
</td>
</tr>
</table>
</div>
</body>
</html>
4. Контроллер Angular
Далее давайте посмотрим на наш контроллер AngularJS:
Обратите внимание, что:
var app = angular.module('myApp', ["ngTable", "ngResource"]);
app.controller('mainCtrl', function($scope, NgTableParams, $resource) {
...
});
Мы внедрили модуль ngTable, чтобы использовать его для отображения наших данных в удобном для пользователя виде. table и обрабатывать операции разбиения на страницы/сортировки Мы также внедрили модуль ngResource, чтобы использовать его для доступа к нашим ресурсам REST API
-
5. Таблица данных AngularJS
Давайте теперь быстро рассмотрим модуль ng-table — вот конфигурация :
API ожидает определенного стиля нумерации страниц, поэтому нам нужно настроить его здесь, в таблице, чтобы он соответствовал ему. Мы используем параметры из ng-модуля и создаем здесь свои собственные параметры запроса.
$scope.feed = $resource("api/myFeeds/:feedId",{feedId:'@id'});
$scope.tableParams = new NgTableParams({}, {
getData: function(params) {
var queryParams = {
page:params.page() - 1,
size:params.count()
};
var sortingProp = Object.keys(params.sorting());
if(sortingProp.length == 1){
queryParams["sort"] = sortingProp[0];
queryParams["sortDir"] = params.sorting()[sortingProp[0]];
}
return $scope.feed.query(queryParams, function(data, headers) {
var totalRecords = headers("PAGING_INFO").split(",")[0].split("=")[1];
params.total(totalRecords);
return data;
}).$promise;
}
});
Несколько дополнительных замечаний о нумерации страниц:
params.page() начинается с 1, поэтому нам также нужно убедиться, что он становится нулевым индексом при общении с API. params.sorting() возвращает объект – например, {“name” : “asc” }, поэтому нам нужно разделить ключ и значение как два разных параметра – sort, sortDir мы извлекаем общее количество элементов из HTTP-заголовка ответа
-
6. Еще Операции
Наконец, мы можем выполнять множество операций с помощью модуля ngResource — $resource покрывает всю семантику HTTP с точки зрения доступных операций. Мы также можем определить нашу пользовательскую функциональность.
В предыдущем разделе мы использовали запрос для получения списка каналов. Обратите внимание, что и get, и query выполняют GET, но query используется для обработки ответа массива.
6.1. Добавить новую ленту
Чтобы добавить новую ленту, мы будем использовать метод сохранения $resource – следующим образом:
6.2. Обновление фида
$scope.feed = {name:"New feed", url: "http://www.example.com/feed"};
$scope.createFeed = function(){
$scope.feeds.save($scope.feed, function(){
$scope.tableParams.reload();
});
}
Мы можем использовать наш собственный метод с $resource – следующим образом:
Обратите внимание, как мы настроили наш собственный метод обновления для отправки запроса PUT.
$scope.feeds = $resource("api/myFeeds/:feedId",{feedId:'@id'},{
'update': { method:'PUT' }
});
$scope.updateFeed = function(){
$scope.feeds.update($scope.feed, function(){
$scope.tableParams.reload();
});
}
6.3. Удалить ленту
Наконец, мы можем удалить ленту с помощью метода удаления:
7. Диалог AngularJs
$scope.confirmDelete = function(id){
$scope.feeds.delete({feedId:id}, function(){
$scope.tableParams.reload();
});
}
Теперь давайте посмотрим, как использовать модуль ngDialog для отображения простой формы для добавления/обновления наших лент. .
Вот наш шаблон, мы можем определить его на отдельной странице HTML или на той же странице:
Затем мы откроем диалоговое окно для добавления/редактирования канала:
<script type="text/ng-template" id="templateId">
<div class="ngdialog-message">
<h2>{{feed.name}}</h2>
<input ng-model="feed.name"/>
<input ng-model="feed.url"/>
</div>
<div class="ngdialog-buttons mt">
<button ng-click="save()">Save</button>
</div>
</script>
Примечание что:
$scope.addNewFeed = function(){
$scope.feed = {name:"New Feed", url: ""};
ngDialog.open({ template: 'templateId', scope: $scope});
}
$scope.editFeed = function(row){
$scope.feed.id = row.id;
$scope.feed.name = row.name;
$scope.feed.url = row.url;
ngDialog.open({ template: 'templateId', scope: $scope});
}
$scope.save = function(){
ngDialog.close('ngdialog1');
if(! $scope.feed.id){
$scope.createFeed();
} else{
$scope.updateFeed();
}
}
$scope.save() вызывается, когда пользователь нажимает кнопку «Сохранить» в нашем диалоговом окне. $scope.addNewFeed() вызывается, когда пользователь нажимает кнопку «Добавить новый канал» на странице каналов — он инициализирует новый объект канала (без id) $scope.editFeed() вызывается, когда пользователь хочет отредактировать определенную строку в таблице Feeds
-
8. Обработка ошибок
Наконец, давайте посмотрим, как обрабатывать сообщения об ошибках ответа с помощью AngularJS.
Чтобы обрабатывать ответы об ошибках сервера глобально, а не по запросу, мы зарегистрируем перехватчик в $httpProvider:
А вот представление нашего сообщения в HTML:
app.config(['$httpProvider', function ($httpProvider) {
$httpProvider.interceptors.push(function ($q,$rootScope) {
return {
'responseError': function (responseError) {
$rootScope.message = responseError.data.message;
return $q.reject(responseError);
}
};
});
}]);
~ ~~ 9. Заключение
<div ng-show="message" class="alert alert-danger">
{{message}}
</div>
Это был краткий обзор использования REST API из AngularJS.
Полную реализацию этого руководства можно найти в проекте github — это проект на основе Eclipse, поэтому его легко импортировать и запускать как есть.
«