2012-11-13 41 views
7

我有一个这样定义的AngularJS $资源:

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

和一个RESTful API。所以,当我在MenusGET我得到这个回:

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

问题是,我怎么删除菜单2? (因为它有自己的超媒体链接:http://cafe.com/api/menus/2

+0

你在哪里停留?您是否能够将XML文档转换为JavaScript数据结构,而您只是不确定如何修改它?你无法获得创建的数据结构吗?你目前有什么代码,结果如何? –

+0

我宁可不开始操纵JS对象来提取ID。我不想让ID在我的代码周围浮动。我宁愿使用自引用项目'href'来发送'DELETE'请求。我支持我想知道每个项目是否是一种“资源”对象?或者Angular的要求太高了? – Greg

+0

啊,当你说“删除”时,你的意思是通过HTTP删除服务器上的资源。据我所知,Angular不理解XML - 一旦在您的应用程序中解决了诺言,什么是“菜单”(通过'console.log')? –

回答

11

假设您已经从XML去JavaScript对象的角度管理阵列,你可以用这个来渲染对象:

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

,并在你的控制器,你可以这样做:

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

看,没有客户端创建的URL! :)

更新:修复拼接命令中的错误,是splice(index, index),但应该是splice(index, 1)

+0

似乎当你通过资源获得一个数组,像'var Menus = $ resource('http://cafe.com/api/menus');'那个并不意味着数组中的每个项目都是资源。因此$ http是在这种情况下去的方法... – Greg

+1

@Greg - 不,只需设置isArray:true就像文档在GET上显示的那样:http://docs.angularjs.org/api/ngResource.$resource –

+0

是的,同意,当时没有看到。 – Greg

2

如果您的REST服务返回JSON到角和JSON包括返回的数据的菜单ID。

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

我不想通过ID的周围,如果我能帮助它。资源属于给定的HREF。所以我想要做的就是向给定的URL发送一个HTTP DELETE请求。也许我应该循环浏览菜单并实例化一个自定义菜单对象并将HREF分配给对象上的一个属性.... – Greg

+0

如果您不使用常规的$ http服务,可以对href执行DELETE请求想要使用$资源系统 – Guillaume86

+1

True,但我想知道是否可以将菜单数组中的每个“菜单”视为资源对象。所以var menus = Menu.query();然后菜单[0]。$ delete();那可能吗? – Greg