1

ngResourceを使用してFirebaseRESTAPIを使用しようとしています。このAPIは、コレクションと個々のレコードを取得するためにわずかに異なるURLを使用します。たとえば、次の方法でアクセスするコレクションがあります。

https://angular-resource-test.firebaseIO.com/systems.json

しかし、私が使用する個々のシステムにアクセスしたい場合は、次のようにします。

https://angular-resource-test.firebaseIO.com/systems/1.json

リソース宣言でこれにパラメータベースのURLを指定するにはどうすればよいですか?

通常、私は次のようなことをします

app.factory('System', ['$resource', function($resource) {
  var System = $resource(
    'https://angular-resource-test.firebaseIO.com/systems/:id.json',
    {id: "@id"},
    {update: {method: "PUT"}}
  );
  return System;
}]);

ただし、末尾に.jsonがないため、コレクションでは失敗します。または、コレクションで機能するURLを指定すると、個々の行を選択する場合に失敗します。例については、このjsfiddleを参照してください。

http://jsfiddle.net/D5E6w/15/

4

3 に答える 3

1

リソースでHTTPGETを送信するメソッドは2つあります。

  • get:オブジェクトを受け取ることを期待します
  • クエリ:配列を受け取ることを期待します

APIはあまり落ち着きがなく、このため、異なるURIを使用するため、必要な処理を実行するには2つのリソースが必要になります(Carlの回答を参照)。RESTサービスを編集できるかどうかはわかりませんが、それを行うための良い方法は次のとおりです: https ://angular-resource-test.firebaseIO.com/systems/クエリ(配列を期待) https:// angle -取得のためのresource-test.firebaseIO.com/systems/:id。(オブジェクトを期待する)

このサービスを使用すると、リソースを使用できます。

var System = $resource(
  'https://angular-resource-test.firebaseIO.com/systems/:id',
  {id: "@id"},
  {update: {method: "PUT"}}
);

あなたはこのようにあなたの電話をするでしょう:

var systems = System.query({});
var system = System.get({id:1});
于 2013-03-20T02:39:54.807 に答える
0

問題は、isArrayを使用して解決する必要があります。クエリに対してtrueを指定し、SystemおよびSystemTypeのメソッドを取得します。これは、サーバー側でjsonがどのようにフォーマットされているかと関係があります。詳細な説明については、Angularドキュメントを参照してください。http://jsfiddle.net/D5E6w/24/

{
   update: { method: "PUT" },
   query: { method: "GET", isArray: true },
   get: { method: "GET", isArray: true }
}

これは、システムのコレクションと単一のレコードの両方を使用した実例です。それぞれのisArray値に注意してください。http://jsfiddle.net/D5E6w/51/

于 2013-03-19T18:11:04.407 に答える
0

これが$resourceURL全体を置き換える私の解決策です。これが必要だったのは、 HAL Rest応答を使用していて、たとえばページ付けを行うときに、URL内のパラメーターだけでなく、URL全体を置き換えたいと思ったからです。

app.factory('$rest', ['$resource', 'HALParser', function($resource, HALParser) {
    return function($url) {
        $url = ($url == null) ? 'http://localhost:8000/:type' : $url;
        return $resource($url, {type: ''}, {
            update: { method:'PUT' },
            get : {
                method: 'GET',
                transformResponse: [function(data) {
                    return (new HALParser()).parse(angular.fromJson(data));
                }]
            }
        });
    }
}]);

その後、

app.controller('VendorsController', ['$scope', '$rest', 
        function($scope, $rest) {

        $scope.data = $rest().get({type: 'vendors'});

        $scope.create = function() {
            $rest().save({type: 'vendors'}, {name: $scope.item});
        };
        $scope.load = function($item) {
            console.log($item);
        };

        $scope.page = function($url) {
            $scope.data = $rest($url).get();
        };
    }]);

サービス情報からの$resourcereturnを、引数URLを持つ関数でラップしただけです。

于 2014-02-14T08:42:43.037 に答える