2013-01-14 26 views
1

我已经定义了自己的使用API​​与Angular.js对象:不能与angular.js删除

angular.module('api', ['ngResource']) 
    .factory('Server', function ($resource) { 
     return $resource('http://localhost\\:3000/api/servers/:name'); 
    }) 
    .factory('ActiveServer', function ($resource) { 
     return $resource('http://localhost\\:3000/api/servers/active/:name', {}, 
      { start: {method: 'POST'}, stop: {method: 'DELETE'} }); 
    }); 

的想法是,我有一组定义的服务器,可通过/api/servers/ URI 。一个特定的服务器可以通过将其添加到/api/servers/active/ uri来启动,并通过删除来停止。

在我的控制,我有以下代码:

$scope.start = function() { 
    ActiveServer.start(this.server); 
}; 

$scope.stop = function() { 
    ActiveServer.stop(this.server); 
}; 

这又是通过按钮

<div class="well span4" ng-repeat="server in servers"> 
     <h1>{{server.definition.name}}</h1> 
     <span class="label label-info">{{server.status}}</span> 
     <button type="button" class="btn btn-primary" 
       ng-click="start()">Start</button> 
     <button type="button" class="btn btn-primary" 
       ng-click="stop()">Stop</button> 
    </div> 

启动服务器工作正常的触发,但我有麻烦停止它。上面的代码具有以下请求结束:

Request URL:http://localhost:3000/api/servers/active?$$hashKey=005&_events=[object+Object]&definition=[object+Object]&status=ready 
Request Method:DELETE 

definition -part我的服务器对象的,包含标识服务器停止名称,isn't系列化右。

我该如何解决这个问题?

回答

3

如果您的API(ActiveServer)只需要接收服务器的名称即可使用,则在服务调用期间仅传递服务器的名称。就像这样:

$scope.start = function() { 
    ActiveServer.start({name: this.server.definition.name}); 
}; 

$scope.stop = function() { 
    ActiveServer.stop({name: this.server.definition.name}); 
}; 

传递整个this.server对象中的任何服务调用将导致整个物体上被参数化到HTTP请求。

扩展解释:

当您使用您的$resource网址类似api/servers/:name,你基本上是说,:name部分将通过一个属性具有相同名称的值来代替(在此情况下,'名称')收到的参数(即{name: 'someName'})。

从angularJS $resource documentation

在参数对象中的每个密钥值首先结合到URL模板 如果存在的话,然后任何过量键后附加在URL的搜索查询 ?。给定一个模板/路径/:动词和参数 {动词:'问候',称呼:'你好'}结果URL为 /path/greet?salutation = Hello。如果参数值的前缀为 @,那么将从数据对象 中提取该参数的值(对非GET操作有用)。

所以,如果你拨打service.get({name: 'abc'})那么这个请求的URL会 api/server/abc

如果你打电话service.get({name: 'abc', id: '123'})那么URL将是api/server/abc?id=123

在你的情况下,this.server对象看起来是这样的:

{ 
    $$hashKey: 005, 
    _events: {}, 
    definition: {}, 
    status: ready 
} 

由于AngularJS确实不做深入参数化,_eventsdefinitions在URL上显示为_events=[object+Object]&definition=[object+Object]

+0

这可能是一种解决方法 - 我必须尝试一下 - 但我很想解释为什么我的解决方案无法正常工作,以及如何使用它。 – Vegar

+1

用一些扩展的解释更新了我的答案。希望能帮助到你。 – bmleite