2013-08-30 86 views
7

我在AngularJS应用程序中使用Restangular。我有一个表格,每个项目都有一个删除链接。我想删除该项目并自动删除该行。但事实是,它只从数据库中删除。我如何重构事件,以便DOM自动更新?使用Restangular删除条目

// 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资源。所有的管理员/数据表演示似乎都能从静态数据中工作。

+0

如果项目从'$ scope.products'集合中删除,您可以检查代码吗? – Chandermani

+0

它没有。我想我必须从资源和scope.products中删除。我想我正在寻找一种不必这样做的方式 - 但可能不会。 – cyberwombat

+0

你可以随时看看restangular的来源,并验证:) – Chandermani

回答

19

根据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而不使用,它将从阵列中删除元素。我猜如果他们在自己的自述页面中发布该示例,这意味着.remove()函数不会从集合中删除原始项目。这是有道理的,因为不是每个你删除的项目都想从集合中删除。

另外,如果DELETE $HTTP请求失败会发生什么?然后,您不想删除该项目,并且必须确保在代码中处理该问题。

+0

有道理。尽管如此,我还没有工作。 product.remove()调用错误的URL - 不知道为什么 - 它做一个DELETE /产品而不是DELETE /产品/ ID – cyberwombat

+4

啊解决了!我使用Mongo,因此它发送_id而不是id。我需要这个配置RestangularProvider.setRestangularFields({id:“_id”}); – cyberwombat

+0

这完全适合我。但是,如果您从$ scope.products中删除最后一个元素,那么它不再是一个重复项目,因此您无法将项目添加回它。我预计它会离开核心重振的东西,但事实并非如此。任何解决方案? –

2

在我的情况下,上述不起作用。我必须执行以下操作:

$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

这也适用于我。谢谢。 –