AngularJS $ ресурс и гипермедиа
У меня есть AngularJS $ ресурс, определенный следующим образом:
var Menus = $resource('http://cafe.com/api/menus');
и RESTful API. Поэтому, когда я делаю GET
на Menus
Я получаю это обратно:
<cafe>
<collection href="http://cafe.com/api/menus" type="menus">
<template>
<data name="Name" prompt="Menu name" />
</template>
<items>
<item href="http://cafe.com/api/menus/1">
<link href="http://cafe.com/api/menus/1/ingredients" rel="ingredients" />
<data name="Name" prompt="Menu name">Morning</data>
</item>
<item href="http://cafe.com/api/menus/2">
<link href="http://cafe.com/api/menus/2/ingredients" rel="ingredients" />
<data name="Name" prompt="Menu name">Happy Hour</data>
</item>
</items>
</collection>
</cafe>
Вопрос в том, как удалить меню 2? (учитывая, что у него есть собственная гиперссылка: http://cafe.com/api/menus/2
)
2 ответа
Решение
Предполагая, что вы перешли от XML к массиву JavaScript-объектов под управлением Angular, вы можете использовать его для визуализации ваших объектов:
<tr ng-repeat="cafe in cafes">
<td>{{cafe.name}}</td>
<td>
<button class="btn" ng-click="deleteCafe($index, cafe)">Delete</button>
</td>
</tr>
и в вашем контроллере вы можете сделать это:
function ListCtrl($scope, $http, CafeService) {
CafeService.list(function (cafes) {
$scope.cafes = cafes;
});
$scope.deleteCafe = function (index, cafe) {
$http.delete(cafe.self).then(function () {
$scope.cafes.splice(index, 1);
}, function () {
// handle error here
});
}
}
Смотри, не нужно создавать URL-адреса на стороне клиента!:)
обновление: исправлена ошибка в команде сращивания, было splice(index, index)
, но должно быть splice(index, 1)
,
Если ваша служба REST возвращает JSON в angular и JSON включает идентификатор меню в возвращаемые данные.
var Menu = $resource('http://cafe.com/api/menus/:id', { id: '@id' }); // replace @id with @<the id field in your json object>
// Delete menu 2
Menu.delete({id: 2}, function(){ // Success callback
// Get all menus,
var menus = Menu.query(function() { // Success callback
// alternative delete syntax:
var lastMenu = menus.pop();
lastMenu.$delete();
});
});