1

我已经为自己定义了一个用于 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服务器对象的 - 部分,包含标识要停止的服务器的名称,没有正确序列化。

我怎样才能解决这个问题?

4

1 回答 1

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当您在 URL 上使用类似的东西时$resource,您基本上是说该:name部分将被参数(即)接收到的具有相同名称{name: 'someName'}(在本例中为“名称”)的属性的值替换。

从 angularJS $resource 文档

参数对象中的每个键值首先绑定到 url 模板(如果存在),然后将任何多余的键附加到 ? 之后的 url 搜索查询。给定模板 /path/:verb 和参数 {verb:'greet',salutation:'Hello'} 会产生 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 没有进行深入的参数化_events并且definitions显示_events=[object+Object]&definition=[object+Object]在 URL 上。

于 2013-01-15T00:21:12.257 回答