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();
  });
});
Другие вопросы по тегам