Удаление записи с Restangular

Я использую Restangular в своем приложении AngularJS. У меня есть таблица со ссылкой на удаление для каждого элемента. Я хотел бы удалить элемент и автоматически удалить строку. Но в действительности он удаляет только из БД. Как я могу реорганизовать вещи, чтобы DOM обновлялся автоматически?

// The controller
angular.module('myApp').controller('ManageCtrl', function($scope, Restangular) {

  $scope.delete = function(e) {
     Restangular.one('product', e).remove();
  };

  Restangular.all('products').getList({}).then(function(data) {
    $scope.products = data.products;
    $scope.noOfPages = data.pages;
  });
});


 // The view
 <li ng-repeat="product in products">
   <a href="#" ng-click="delete(sheet._id)"></a>
  </li>

Я также хотел бы найти пример этого - даже с ресурсом Angular. Все демонстрации таблиц admin/data, похоже, работают со статическими данными.


person cyberwombat    schedule 30.08.2013    source источник
comment
Можете ли вы проверить код, если элемент будет удален из коллекции $scope.products?   -  person Chandermani    schedule 30.08.2013
comment
это не так. Я думаю, что мне нужно удалить как из ресурса, так и из области видимости.продукты. Я думаю, я ищу способ не делать этого, но может и не быть.   -  person cyberwombat    schedule 30.08.2013
comment
Вы всегда можете посмотреть на рестангулярный исходник и убедиться :)   -  person Chandermani    schedule 30.08.2013


Ответы (2)


Согласно Restangular https://github.com/mgonto/restangular#restangular-methods они упомяните, что вы должны использовать исходный элемент и выполнить действие с ним, поэтому в вашем html-коде вы должны:

 <li ng-repeat="product in products">
   <a href="#" ng-click="delete(product)"></a>
</li>

Затем в вашем контроллере:

 $scope.delete = function( product) {
    product.remove().then(function() {
      // edited: a better solution, suggested by Restangular themselves
      // since previously _.without() could leave you with an empty non-restangular array
      // see https://github.com/mgonto/restangular#removing-an-element-from-a-collection-keeping-the-collection-restangularized

      var index = $scope.products.indexOf(product);
      if (index > -1) $scope.products.splice(index, 1);
   });
 };

Обратите внимание, что они используют underscore.js без, что удалит элемент из массива. Я предполагаю, что если они публикуют этот пример на своей странице readme, это означает, что функция .remove() не удаляет исходный элемент из коллекции. Это имеет смысл, поскольку не каждый элемент, который вы удаляете, вы хотите удалить из самой коллекции.

Кроме того, что произойдет, если запрос DELETE $HTTP завершится ошибкой? Вы не хотите удалять элемент тогда, и вы должны убедиться, что справились с этой проблемой в своем коде.

person Gilad Peleg    schedule 30.08.2013
comment
Имеет смысл. У меня пока не работает. product.remove() вызывает неправильный URL - не знаю почему - он выполняет DELETE /products вместо DELETE /products/ID - person cyberwombat; 30.08.2013
comment
Ах решено!. Я использую Mongo, поэтому он отправляет _id вместо id. Мне нужна эта конфигурация RestangularProvider.setRestangularFields({id: _id}); - person cyberwombat; 30.08.2013
comment
Это полностью работает для меня. Однако, если вы удалите последний элемент из $scope.products, он перестанет быть прямоугольным проектом, и вы не сможете добавить в него элементы обратно. Я ожидал, что он оставит основной прямоугольный материал, но это не так. Любое решение для этого? - person Nate Bunney; 18.11.2014
comment
Возможно, ознакомьтесь с этим ответом: stackoverflow.com/a/25786898/2634690 Решение заключается в использовании соединения массива $.products - person Gilad Peleg; 18.11.2014
comment
Или еще лучше — ознакомьтесь с решением Restangular: github.com/mgonto/ - person Gilad Peleg; 18.11.2014

В моем случае вышеописанное не совсем сработало. Мне пришлось сделать следующее:

$scope.changes = Restangular.all('changes').getList().$object;

    $scope.destroy = function(change) {
        Restangular.one("changes", change._id).remove().then(function() {
            var index = $scope.changes.indexOf(change);
            if (index > -1) $scope.changes.splice(index, 1);
        });
    };
person ssedwards    schedule 18.03.2015