2012-11-13 19 views
7

Mam angularjs $ zasób zdefiniowany następująco:

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

i REST API. Więc kiedy zrobić GET na Menus otrzymuję ten powrotem:

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

pytanie brzmi:, w jaki sposób mogę usunąć menu 2? (biorąc pod uwagę, że ma on własny link hipermediowy: http://cafe.com/api/menus/2)

+0

Gdzie utknąłeś? Czy możesz uzyskać dokument XML w strukturze danych JavaScript, a nie wiesz, jak go zmodyfikować? Nie możesz utworzyć struktury danych? Jaki masz kod do tej pory i jakie są wyniki? –

+0

Wolałbym nie zaczynać manipulacji obiektem JS, aby wyodrębnić identyfikator. Nie chcę, aby identyfikatory unosiły się wokół mojego kodu. Wolałbym użyć samoodnośnego elementu 'href' do wysłania żądania' DELETE'. Wspieram Zastanawiam się, czy każdy element jest rodzajem obiektu 'resource'? czy to jest zbyt wiele od Angulara? – Greg

+0

Ah, kiedy mówisz "usuń", masz na myśli usunięcie zasobu na serwerze przez HTTP. O ile mi wiadomo, Angular nie rozumie XML-a - czym jest "Menus" (powiedzmy przez "console.log"), gdy obietnica zostanie rozwiązana w twojej aplikacji? –

Odpowiedz

11

Zakładając, że masz już z XML do kątowym zarządzane tablicę obiektów JavaScriptu, można to wykorzystać, aby uczynić swoje obiekty:

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

w kontrolerze można to zrobić:

Zobacz, bez tworzenia po stronie klienta adresów URL! :)

zmiana: naprawiono błąd w poleceniu splotem, był splice(index, index), ale powinno być splice(index, 1).

+0

wydaje się, że kiedy otrzymasz tablicę za pośrednictwem zasobu, np. 'Var Menus = $ resource ('http://cafe.com/api/menus');' that nie oznacza, że ​​każdy element w tablicy jest zasobem. W związku z tym $ http jest drogą do zrobienia w tym przypadku ... – Greg

+1

@Greg - Nie, po prostu ustaw isArray: tak jak w przypadku dokumentacji, pokaż już na GET: http://docs.angularjs.org/api/ngResource.$resource –

+0

Tak, zgodził się, nie widziałem tego w tym czasie. – Greg

2

Jeśli usługa REST zwraca wartość JSON do wartości kątowej, a JSON zawiera identyfikator menu w zwróconych danych.

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

Nie chcę przekazywać identyfikatorów, jeśli mogę pomóc. Zasób należy do danego HREF. Więc wszystko, co chcę zrobić, to wysłać żądanie HTTP DELETE do podanego adresu URL. Może powinienem przejrzeć menu i utworzyć instancję niestandardowego obiektu menu i przypisać HREF do właściwości obiektu .... – Greg

+0

możesz po prostu użyć standardowej usługi $ http, aby wykonać żądanie DELETE na href, jeśli nie chcesz chcę użyć systemu $ resource – Guillaume86

+1

True, ale chciałbym wiedzieć, czy mogę traktować każde "Menu" w tablicy Menu jak obiekt zasobów. Zatem menu var = Menu.query(); Następnie menu [0]. $ Delete(); czy to jest możliwe? – Greg