2

私は AngularJS を初めて使用し、現在 Django/Tastypie API を使用して webapp を構築しています。この Web アプリは投稿で動作し、API 呼び出し (GET) は次のようになります。

{
    title: "Bootstrap: wider input field - Stack Overflow",
    link: "http://stackoverflow.com/questions/978...",

    author: "/v1/users/1/",

    resource_uri: "/v1/posts/18/",
}

これらのオブジェクトを要求するために、次のように宣言されたリソースを埋め込むAngularのサービスを作成しました:

Post: $resource(ConfigurationService.API_URL_RESOURCE + '/v1/posts/:id/')

すべてが魅力のように機能しますが、2つの問題を解決したいと思います:

  1. authorフィールドをその値で適切に置き換える方法は? つまり、参照フィールドごとに可能な限り自動的にリクエストを行うにはどうすればよいでしょうか。
  2. 同じエンドポイントでの複数の呼び出しを避けるために、この値をキャッシュする方法は?

繰り返しますが、私は angularJS を初めて使用するので、$resourceオブジェクトの理解において何かを見落としている可能性があります。

ありがとう、マキシム。

4

1 に答える 1

1

質問1に関して、私は簡単な、すぐに使える解決策を知りません。カスタム応答トランスフォーマーを使用して、補助的な$ resource要求を起動し、それらの要求からのpromiseを応答オブジェクトのプロパティとして(URLの代わりに)添付できると思います。$ resourceファクトリの最近のバージョンでは、指定することができます$resourceインスタンス用のこのようなトランスフォーマー。グローバルデフォルト応答トランスフォーマー($ httpProvider.defaults.transformResponse)に委任して、実際のJSONを取得し、プロパティを置き換えて、そこから補助リクエストを起動します。また、この方法で委任する場合は、ドキュメントに1つしか記載されていなくても、自分の応答トランスフォーマーが呼び出されたときに受け取るパラメーターを1つではなく最初の2つに渡すことを忘れないでください(これは難しい方法で学びました)。

すべての最後の約束がいつ達成されたかを知る方法はありませんが、この知識に依存するコードはないと思います(UIがモデルオブジェクトの断片にバインドされるのが一般的であるため、それ自体がプロミスであり、元のHTTPリクエストによって返されます)。

質問2については、メインオブジェクト(この場合、参照を保持する手段として$ scopeで十分です)を参照しているのか、アセンブルの手段としてダウンロードすることを提案しているこれらの補助オブジェクトを参照しているのかわかりません。クライアント側で集約します。後者を想定すると、たとえば、$ scope内のオブジェクトにURLを関連付けるハッシュを維持し、補助的な$resourceリクエストの成功関数でこのディクショナリを更新するようなことができると思います。次に、上記の応答トランスフォーマーで最初にハッシュをチェックして、目的のリソースインスタンスが既に取得されているかどうかを確認し、そのようなローカルコピーがない場合にのみバックエンドから$resourceを取得します。

これは、アプリケーションレイヤーでアグリゲートをアセンブルし、事前に調理して提供する方がはるかに簡単な場合に、クライアント側でリソースをアセンブルするための一連の作業(およびラウンドトリップ)です。RESTは、データの正規化を期待していません。

于 2013-03-19T03:54:00.923 に答える