2013-08-30 8 views
7

Ich benutze Restangular in meiner AngularJS App. Ich habe eine Tabelle mit einem Link zum Löschen für jeden Artikel. Ich möchte den Artikel löschen und die Zeile automatisch entfernen lassen. Aber wie Dinge nur aus DB gelöscht werden. Wie kann ich Dinge umgestalten, damit das DOM automatisch aktualisiert wird?Eintrag mit Restangular löschen

Ich würde auch gerne ein Beispiel dafür finden - auch mit Angular Ressource. Alle Admin/Datentabellen-Demos scheinen aus statischen Daten zu funktionieren.

+0

Können Sie den Code einchecken, wenn Artikel aus '$ scope.products' Sammlung entfernt wird? – Chandermani

+0

ist es nicht. Ich denke, dass ich sowohl von der Ressource als auch von den scope.products löschen muss. Ich schätze, ich suche nach einer Möglichkeit, das nicht tun zu müssen - aber vielleicht nicht. – cyberwombat

+0

Sie können immer die restangular Quelle ansehen und verifizieren :) – Chandermani

Antwort

19

Nach Restangular https://github.com/mgonto/restangular#restangular-methods sie erwähnen, dass Sie das ursprüngliche Element verwenden sollten, und eine Aktion mit, so in Ihrem HTML-Code ausführen sollten Sie:

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

Dann in Ihrem Controller:

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

Beachten Sie, dass sie die underscore.js ohne verwenden, die das Element aus dem Array entfernen wird. Ich denke, wenn sie dieses Beispiel auf ihrer Readme-Seite posten, bedeutet das, dass die Funktion .remove() das Originalelement nicht aus der Sammlung entfernt. Dies ist sinnvoll, da nicht alle Objekte, die Sie entfernen, aus der Sammlung entfernt werden sollen.

Was passiert auch, wenn die DELETE $HTTP Anfrage fehlschlägt? Sie möchten das Element dann nicht entfernen, und Sie müssen sicherstellen, dass dieses Problem in Ihrem Code behandelt wird.

+0

Sinn machen. Ich habe es noch nicht funktioniert. product.remove() ruft die falsche URL auf - nicht sicher, warum - es tut ein DELETE/Produkte statt DELETE/Produkte/ID – cyberwombat

+4

Ah gelöst !. Ich benutze Mongo, also sendet es _id anstelle von id. Ich brauche diese Konfiguration RestangularProvider.setRestangularFields ({id: "_id"}); – cyberwombat

+0

Das funktioniert total für mich. Wenn Sie jedoch das letzte Element aus $ scope.products entfernen, ist es kein restanguläres Projekt mehr, sodass Sie keine Elemente mehr hinzufügen können. Ich habe erwartet, dass es das restliche Kernmaterial verlässt, aber das tut es nicht. Irgendeine Lösung dafür? –

2

In meinem Fall funktionierte das oben genannte nicht ganz. Ich musste folgendes tun:

$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

Das funktioniert auch für mich. Vielen Dank. –