2012-11-13 14 views
7

ho un $ risorsa AngularJS definita in questo modo:

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

e un'API RESTful. Così, quando faccio un GET su Menus ottengo questo ritorno:

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

domanda è, come faccio menu 2 a cancellare? (dato che ha un proprio collegamento ipermediale: http://cafe.com/api/menus/2)

+0

Dove sei bloccato? Sei in grado di ottenere il documento XML in una struttura di dati JavaScript e non sei sicuro di come modificarlo? Non sei in grado di ottenere la struttura dati creata? Che codice hai finora e quali sono i risultati? –

+0

Preferisco non iniziare a manipolare l'oggetto JS per estrarre l'ID. Non voglio che gli ID galleggiano attorno al mio codice. Preferirei usare l'elemento autoreferenziale 'href' per inviare una richiesta' DELETE' a. Sostengo che mi chiedo se ogni elemento sia un tipo di oggetto 'risorsa'? o è chiedere troppo ad Angular? – Greg

+0

Ah, quando si dice "cancella", si intende eliminare la risorsa sul server tramite HTTP. Per quanto ne so, Angular non capisce l'XML - cosa è 'Menu '(diciamo, tramite' console.log') una volta che la promessa è stata risolta nella tua app? –

risposta

11

Supponendo che te ne sei andato dal XML per un allineamento angolare gestiti di oggetti JavaScript, è possibile utilizzare questo per rendere gli oggetti:

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

e il controller si può fare questo:

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

Look, nessuna creazione di URL lato client! :)

aggiornamento: fissato un errore nel comando giunzione, sia splice(index, index), ma dovrebbe essere splice(index, 1).

+0

sembra che quando ottieni un array tramite una risorsa, come 'var Menu = $ resource ('http://cafe.com/api/menus');' che non significa che ogni elemento dell'array è una risorsa. Quindi $ http è la strada da percorrere in questa istanza ... – Greg

+1

@Greg - No, basta impostare isArray: true come la documentazione mostra già su GET: http://docs.angularjs.org/api/ngResource.$resource –

+0

Sì, d'accordo, non l'ho visto in quel momento. – Greg

2

Se il servizio REST restituisce JSON ad angolo e il JSON include l'ID del menu nei dati restituiti.

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

Non voglio passare l'ID in giro se posso aiutarlo. La risorsa appartiene al HREF dato. Quindi tutto ciò che voglio fare è inviare una richiesta DELETE HTTP all'URL specificato. Forse dovrei scorrere i menu e creare un'istanza di un oggetto di menu personalizzato e assegnare l'HREF a una proprietà sull'oggetto .... – Greg

+0

puoi semplicemente usare il normale servizio $ http per fare una richiesta DELETE su href se non lo fai voglio usare il sistema $ risorse – Guillaume86

+1

Vero, ma mi piacerebbe sapere se potrei trattare ogni "Menu" nella matrice Menu come un oggetto risorsa. Quindi var menus = Menu.query(); Quindi menu [0]. $ Delete(); è possibile? – Greg