2013-08-30 12 views
7

Używam Restangular w mojej aplikacji AngularJS. Mam tabelę z linkiem do usuwania każdego elementu. Chciałbym usunąć przedmiot i automatycznie usunąć wiersz. Ale jak rzeczy to tylko usuwa z DB. Jak mogę refaktoryzować rzeczy tak, aby DOM był aktualizowany automatycznie?Usuwanie wpisu z prostokątnym

// 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> 

Chciałbym również znaleźć przykład tego - nawet z zasobami kątowymi. Wydaje się, że wszystkie prezentacje tabel administracyjnych/danych działają z danych statycznych.

+0

Czy można sprawdzić kod, jeśli element zostanie usunięty z kolekcji '$ scope.products'? – Chandermani

+0

nie. Myślę, że muszę usunąć zarówno z zasobu, jak i zakresu.produktów. Chyba szukam sposobu, żeby tego nie robić - ale może nie być. – cyberwombat

+0

Zawsze możesz spojrzeć na reszta źródła i zweryfikować :) – Chandermani

Odpowiedz

19

Według Restangular https://github.com/mgonto/restangular#restangular-methods wspomnieć, że należy użyć oryginalną pozycję i prowadzenia działań z nim, więc w kodzie html należy:

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

wówczas w kontrolerze:

$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); 
    }); 
}; 

Zauważ, że używają one underscore.js bez, która usunie element z tablicy. Przypuszczam, że jeśli dodadzą ten przykład na swojej stronie readme, oznacza to, że funkcja .remove() nie usuwa oryginalnego elementu z kolekcji. Ma to sens, ponieważ nie każdy przedmiot, który chcesz usunąć, został usunięty z samej kolekcji.

Co się stanie, jeśli żądanie DELETE $HTTP zakończy się niepowodzeniem? Nie chcesz wtedy usuwać elementu i musisz się upewnić, że ten problem występuje w kodzie.

+0

Miej sens. Nie mam jeszcze działającego. product.remove() wywołuje zły URL - nie wiem dlaczego - robi DELETE/produkty zamiast DELETE/products/ID – cyberwombat

+4

Ah rozwiązany !. Używam Mongo, więc wysyła _id zamiast id. Potrzebuję tej konfiguracji RestangularProvider.setRestangularFields ({id: "_id"}); – cyberwombat

+0

To całkowicie działa dla mnie. Jednak jeśli usuniesz ostatni element z $ scope.products, przestanie on być projektem restunkcyjnym, więc nie możesz do niego dodać elementów. Spodziewałem się, że opuści rdzeń, ale niestety nie. Jakieś rozwiązanie tego? –

2

W moim przypadku powyższe nie działało. Musiałem wykonać następujące czynności:

$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); 
     }); 
    }; 
+0

To też działa dla mnie. Dzięki. –