2

Restangular を使用して、アイテムをコレクションに追加した後、バックエンド サービスから取得した要素の外部キー フィールドを展開しようとしています。

urlサービスは、関連するオブジェクトにリンクするフィールドを含む要素で POST に応答します。これらのオブジェクト用のサービスは既に用意されています。

応答は次のようになります。

{
    "url": "http://api.example.com/resources/6/", 
    "name": "Harry", 
    "role": "http://api.example.com/roles/1/", 
}

roleフィールドを次のように拡張したいと思います。

{
    "url": "http://api.example.com/resources/6/", 
    "name": "Harry", 
    "role": "Administrator", 
}

これまでのところ、私は次のものを持っています:

Configurer.setResponseInterceptor(function(data, operation, what, url, response, deferred) {
    if ((operation == 'post' || operation == 'put') && what == 'resources' && 'role' in data && data.role.substr(0,4) == 'http') {
        console.log('Role URL instead of name -- change this');
    }
    return data;
});

理想的には、Restangular をラップする既存のサービスを呼び出したいと思います。インジェクターは必要ですか?それとももっと良い方法がありますか?

4

2 に答える 2

4

FWIW、元の質問からの目標可能です。

「Restangular ResponseInterceptor 内からのサービスの呼び出し」

例:

angular.module('app').factory('myApi', [
  'Restangular', 'myService', '$rootScope', function(restangular, myService, $rootScope) {
    return restangular.withConfig(function(c) {
      c.setResponseInterceptor(function(data, op, what, url, response, deferred) {
        if (op === 'post' && what === 'the_name_of_some_resource' && url.match(/something_or_other/)) {
          myService.doSomething(response.data.something_cool);
          $rootScope.$emit('didSomethingCool');
        }
        return response.data;
      });
    });
  }
]);

次に、myApi を注入して、Restangular の代わりに使用します。応答インターセプターは myService にアクセスできます。これは優れた設計ではない (テストが難しい) ことに注意してください。しかし、これらの線に沿った何かが私にとって便利でした。これは、再構築されたメソッドを直接呼び出していた拡散コードの束をリファクタリングする必要性を延期するためでした。ここで共有します。すべての直接的な再言語呼び出しをサービスにリファクタリングする (より良い設計) 代わりに、これは、複数の場所で呼び出され、応答が受信されるたびに何らかの状態を突然変更する必要がある API アクティビティの要求/応答に結び付ける方法でした。 .

$rootScope の部分は、OP の質問には必須ではありません。変更された構成で resangular を提供するファクトリに (プロバイダーではなく) 任意のものを挿入できることを示すために、これを含めました。これにはもちろん、応答インターセプターから呼び出すことができる独自のサービス インスタンスが含まれます。

別の注意: setResponseInterceptor は非推奨であり、その後継である addResponseInterceptor には別の署名があります (私はそう思います)。

これはどれもテストされておらず、事実を確認していません。

于 2014-03-29T01:30:50.170 に答える
1

この投稿を確認してください:

http://ath3nd.wordpress.com/2013/08/05/15/

まさにその例があります: サーバーによるリターンを増強します。

Restangular は promise を返すため、そのフローを維持するには、サービスでも promise を返さなければならず、そのために $q サービスを注入する必要があります。

于 2013-11-05T14:34:48.713 に答える