2012-11-13 7 views
7

Ich habe eine AngularJS resource $ wie folgt definiert:

var Menus = $resource('http://cafe.com/api/menus'); 

und eine RESTful API. Also, wenn ich ein GET auf Menus bekomme ich diese zurück:

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

Frage ist, wie lösche ich Menü 2? (vorausgesetzt, es hat einen eigenen Hypermedia-Link: http://cafe.com/api/menus/2)

+0

Wo stecken Sie fest? Sind Sie in der Lage, das XML-Dokument in eine JavaScript-Datenstruktur zu bringen, und Sie sind nur nicht sicher, wie Sie es ändern? Können Sie die Datenstruktur nicht erstellen? Welchen Code hast du bisher und was sind die Ergebnisse? –

+0

Ich würde lieber nicht anfangen, das JS-Objekt zu manipulieren, um die ID zu extrahieren. Ich möchte nicht, dass IDs um meinen Code herum laufen. Ich würde lieber das selbstreferenzierende Element 'href' verwenden, um eine 'DELETE'-Anfrage zu senden. Ich unterstütze ich frage mich, ob jeder Gegenstand eine Art von "Ressource" -Objekt ist? oder fragt das zu viel von Angular? – Greg

+0

Ah, wenn Sie "Löschen" sagen, meinen Sie die Ressource auf dem Server über HTTP zu löschen. Soweit mir bekannt ist, versteht Angular XML nicht - was ist 'Menüs' (sagen wir über' console.log') sobald das Versprechen in deiner App gelöst ist? –

Antwort

11

Unter der Annahme, dass Sie aus dem XML zu einem Winke verwaltetes Array von JavaScript-Objekten gegangen sind, können Sie diese verwenden, um Ihre Objekte zu machen:

<tr ng-repeat="cafe in cafes"> 
    <td>{{cafe.name}}</td> 
    <td> 
     <button class="btn" ng-click="deleteCafe($index, cafe)">Delete</button> 
    </td> 
</tr> 

und in Ihrem Controller können Sie dies tun:

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

Schauen Sie, keine clientseitige Erstellung von URLs! :)

Update: einen Fehler in dem Spleiß-Befehl festgelegt, war splice(index, index), soll aber splice(index, 1) sein.

+0

Es scheint, dass, wenn Sie ein Array über eine Ressource, wie 'var Menüs = $ Ressource ('http://cafe.com/api/menus') erhalten; Das bedeutet nicht, dass jedes Element im Array eine Ressource ist. Daher $ HTTP ist der Weg in diesem Fall zu gehen ... – Greg

+1

@Greg - Nein, nur isArray: true wie die Dokumentation zeigen Sie auf GET bereits: http://docs.angularjs.org/api/ngResource.CAressource –

+0

Ja, einverstanden, habe das zu der Zeit nicht gesehen. – Greg

2

Wenn Ihr REST-Dienst JSON an eckig zurückgibt und der JSON die Menü-ID in den zurückgegebenen Daten enthält.

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

Ich möchte nicht die IDs übergeben, wenn ich es helfen kann. Die Ressource gehört zum angegebenen HREF. Alles, was ich tun möchte, ist eine HTTP DELETE Anfrage an die angegebene URL zu senden. Vielleicht sollte ich die Menüs durchlaufen und ein benutzerdefiniertes Menüobjekt instanziieren und das HREF einer Eigenschaft auf dem Objekt zuweisen. – Greg

+0

Sie können einfach den regulären $ http-Dienst verwenden, um eine DELETE-Anforderung für die href zu machen, wenn Sie dies nicht tun möchte das $ resource system verwenden – Guillaume86

+1

Wahr, aber ich würde gerne wissen, ob ich jedes "Menü" im Menüs Array wie ein Ressourcenobjekt behandeln könnte. Also var menus = Menu.query(); Dann Menüs [0]. $ Delete(); ist das möglich? – Greg

Verwandte Themen