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-partは、正しくシリアル化されていません。

どうすればこれを修正できますか?

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リクエストにパラメータ化されます。

詳細な説明:

URLでのようなものを使用する場合、基本的に、そのapi/servers/:name部分は、パラメーター(つまり)で受け取った同じ名前(この場合は「name」)のプロパティの値に置き換えられると言っています。$resource:name{name: 'someName'}

angleJS $ 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、 URLにdefinitions表示さ_events=[object+Object]&definition=[object+Object]れます。

于 2013-01-15T00:21:12.257 に答える