我已经为自己定义了一个用于Angular.js的api:
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
- 我的服务器对象的一部分,包含标识要停止的服务器的名称,没有正确序列化。
我该如何解决这个问题?
答案 0 :(得分: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请求。
扩展说明:
当您在api/servers/:name
网址上使用$resource
之类的内容时,您基本上会说:name
部分将替换为具有相同名称的属性的值(在这种情况下,'name')接收参数(即{name: 'someName'}
)。
来自angularJS $resource documentation:
参数对象中的每个键值首先绑定到url模板 如果存在,则将任何多余的键附加到URL搜索 查询后?给定模板/路径/:动词和参数 {动词:'问候',称呼:'你好'}会产生网址 /路径/打招呼?称呼=你好。如果参数值带有前缀 @然后从数据对象中提取该参数的值 (对非GET操作很有用)。
因此,如果您致电service.get({name: 'abc'})
,则请求的网址将为
api/server/abc
如果您致电service.get({name: 'abc', id: '123'})
,则网址将为api/server/abc?id=123
在您的情况下,this.server
对象看起来像这样:
{
$$hashKey: 005,
_events: {},
definition: {},
status: ready
}
由于AngularJS 没有进行深入的参数化,因此_events
和definitions
在网址上显示为_events=[object+Object]&definition=[object+Object]
。