0

私は次のような多くのURLを持つAPIを持っています:

/ users /profile->現在接続しているユーザーを取得
 / users / bestfriend->現在接続しているユーザーの親友(親友の中で最も親友)を取得
 / users/wife->現在接続されているユーザーの妻を取得


 / users /friends->現在接続しているユーザーの友達を取得する
 / users /bestfriends->現在接続しているユーザーの親友を取得
 / users /childrens->現在接続されているユーザーの子を取得する
 / users /neighbors->現在接続されているユーザーのネイバーを取得します

私はBackboneを初めて使用しますが、現在接続しているユーザーをコレクションとして取得する必要があるのか​​、たとえば単純なモデルとして取得する必要があるのか​​、よくわかりません。

現在のユーザーがBackboneのドキュメントで言及されているようにブーストラップされる可能性があることは知っていますが、ここでは重要ではありません。現在のユーザーモデルをブーストラップできないと仮定してください。


では、フェッチをAPI URLにリダイレクトするにはどうすればよいですか?毎回またはのようなオプションを提供する必要があります{"operation":"profile"}{"operation":"friends"}、またはフェッチを実行する前にコレクションのURLを変更する必要がありますか?

ありがとう

4

3 に答える 3

1

model.urlRootコレクションの「外部」モデルを使用する場合は、プロパティを使用してモデルのURLを指定します。新しいモデル(つまり)の場合は、URLの末尾にIDが自動的に追加さid==nullれ、作成時にPOSTが送信されます。それ以外の場合は、指定されたURLでフェッチ(GET)します。

最後にIDを追加したくない場合:上書きmodel.urlして、フェッチ/配置/投稿する実際のエンドポイントURLを生成します。

urlコレクションには、モデルのurlまたはurlRootが指定されていない場合、コレクションのurlがルートとして取得される(そのモデルがそのコレクションの一部である場合)というプロパティもあります。

したがって、次のいずれかを実行できます。

model.urlRoot = '/users/profile'; //appends id on put/delete requests
model.url = '/users/profile'; //direct endpoint. Can also be a function
collection.url = '/users/friends'; //fetch endpoint for collection. Could also be used by models to put to with appended id.

バックボーンのドキュメントは非常に包括的で自明です。Model.urlRootなどのこれらの部分を読むことをお勧めします

更新:新しいURLに従って

混乱はURLの設計方法によるものだと思います。エンドポイントを複数形/単数形にするのは良い習慣ではありません。

例: /user/friends-ユーザーのすべての友達をうまく取得します。しかし、どのユーザーですか?さらに良い:/users/{id}/friends-特定のユーザーの友達を取得します。

ユーザーの特定の友達を取得します。/users/{id}/friends/{id}

バックボーンに組み込まれているREST対応機能を最大限に活用するために、URLにIDを追加することをお勧めします。それ以外の場合は、独自のプロパティとロジックを定義し、「保存」などの個別の関数を使用$.ajaxして、自分で呼び出しを起動し、成功/エラーコールバックで何かを実行します。

それらがモデルであるかコレクションであるかは、完全にあなた次第です。幸い/残念ながら、バックボーンでそれを行う方法は複数あります。BBの方法に従うと、フレームワークは特定の規則を予期して従うため、よりクリーンな方法で物事を行うことができます。そうでない場合は、いつでもカスタム作成できます。私は両方の方法を実行しました。カスタム作成は簡単に思えます。慣例に従うとある程度の計画が必要ですが、明示的なajax呼び出しによって明示的になるのに対し、プログラマーから「内部」で物を隠したり抽象化したりしても、はるかにクリーンに保たれます。

これはトレードオフです。エンドポイントを再構築し、それに応じてurlプロパティを使用することをお勧めします。それ以外の場合は、あなたとあなたのチームにとって意味のあることを行い、それに固執します。

于 2012-08-13T17:57:57.327 に答える
1

URLの1つに関連するモデルとコレクションをいくつか作成する必要があります。

var Profile = Backbone.Model.extend({
  url: "/users/profile"
});

var BestFriend = Backbone.Model.extend({
  url: "/users/bestfriend"
});

// ...

var Friend = Backbone.Model.extend({});

var Friends = Backbone.Collection.extend({
  model: Friend,
  url: "/users/friends"
});

Friendの親クラスとして使用することもできます。BestFriend

var BestFriend = Friend.extend({
  url: "/users/bestfriend"
});

または、すべてのPersonの親としてクラスを作成することもできます。

var Person = Backbone.Model.extend({});

var Friends = Backbone.Collection.extend({
  model: Person,
  url: "/users/friends"
});

var Profile = Person.extend({
  url: "/users/profile"
});

var BestFriend = Person.extend({
  url: "/users/bestfriend"
});

すべての要素のデータを取得するための個別のURLがあるため、いくつかのフェッチを行う必要があります。

var profile = new Profile();
var bestFriend = new BestFriend();
var friends = new Friends();

profile.fetch();
bestfriend.fetch();
friends.fetch();

次のようにして、すべての要素をProfileインスタンスに参照できます。

var Profile = Person.extend({
  url: "/users/profile",
  initialize: function( opts ){
    this.bestFriend = opt.bestfriend;
    // ...
  }
});

var bestFriend = new BestFriend();
var friends = new Friends();

var profile = new Profile({
  bestfriend: bestfriend
});

要素を整理し、それらのイベントを聞くためのいくつかのアプローチがありますが、これはすべて好みの問題であり、どのアーキテクチャをより快適に満たすかです。

于 2012-08-14T10:03:02.180 に答える
1

基本的に私は最初の答えに同意しますが、簡単にするために、ユーザーのIDを使用して、個別に取得することができます。これにより少し余分な負荷がかかる可能性がありますが、最適化が必要になるまでコードをクリーンに保つ必要があります。

現在のAPI設計で問題が発生する可能性があります。将来、妻の親友が欲しいとしたらどうしますか?URLが「/user/ wife」のオブジェクトがあり、「/ user / wife/bestfriend」と言います。次に、誰かがこれを拡張して「/ user / wife / bestfriend /children/」を作成したいと考えています。これは、バックエンドで解析するにはかなり複雑になります。

基本的に、妻と子供を別々に呼び出す代わりに、プロファイル呼び出しで関連するユーザーのIDを返すようにします。

/profile
{
  id: 165735,
  name: "Peter",
  age: 45,
  wifeId: 246247,
  childrenIds: [352356, 134098]
}

次に、妻を取得することは単純に次のようになります。

/users/246247

これにより、妻は誰かの妻だけでなく、実際のユーザーのままになります。とにかくデータベースに関係が保存されているので、ユーザーを取得するときにここでセキュリティを確認できます。

于 2012-08-27T16:20:53.700 に答える