web-dev-qa-db-ja.com

サーバーから単一のBackboneモデルをフェッチする

ルートを設定したとします。

_'photos/:id' : 'showPhoto'
_

そして誰かがURL _www.mysite.com/photos/12345_を友達と共有します。

友人が共有リンクをクリックすると、showPhotoがコールバックされ、IDとして12345が渡されます。サーバーからモデルをフェッチする方法がわかりません。idプロパティを設定してfetch()を呼び出した場合でも、バックボーンはモデルをisNewと見なし、ajaxリクエストのURLは_/photos_であると見なすためです。 _/photos/12345_の代わりに:

_showPhoto: (id) ->
  photo = new models.Photo _id:id
  photo.fetch #does a GET to /photos, I would have expected it to request /photos/12345
    success: () ->
      render photo view etc...

Photo = Backbone.Model.extend
  idAttribute: '_id'
  urlRoot: '/photos'
_

モデルPhotoは通常コレクションの一部ですが、このシナリオでは、誰かがサイトに直接アクセスしていて、1枚の写真のデータのみを表示することを期待しているため、アプリのこの状態ではコレクションはインスタンス化されません。

写真のコレクション全体を読み込んでからcollection.getById(id)を使用するソリューションはありますか? 1つのモデルのプロパティをロードしたいだけの場合、これはあまりにも非効率に思えます。

17
cjroebuck

コレクションの一部としてモデルがない場合は、モデルに完全なURLを手動で通知する必要があります。指定したurlRootにIDを自動追加しません。これを行うには、関数をurlRootとして指定できます。

Photo = Backbone.Model.extend({
  urlRoot: function(){
    if (this.isNew()){
      return "/photos";
    } else {
      return "/photos/" + this.id;
    }
  }
});

バックボーンはモデルのidを使用してモデルが新しいかどうかを判断するため、これを設定すると、このコードは正しく機能するはずです。そうでない場合は、isNewをチェックする代わりに、ifステートメントでいつでもIDをチェックできます。

25
Derick Bailey

IDにURLを追加するかどうかをバックボーンに指示する必要はありません。ドキュメントによると: http://backbonejs.org/#Model-fetch 、単にurlRootをコレクション内のurlと同等に設定することができます。

次のいずれかの方法を使用すると、バックボーンは目的のIDをURLに自動的に追加します。

model.set("id", 5); //After initialized
model = new Backbone.Model({id: 5}); //New model

属性ハッシュまたはモデルに直接IDを手動で設定した場合、バックボーンはそれを認識しません。

model.id = 5; //Don't do this!
3
Alan

すでに同様の質問があります: " Backboneで単一のモデルをフェッチするにはどうすればよいですか? "

私の答えはあなたのために働くはずです(そしてそれはcoffeescriptにあります)

また、チェックすることを忘れないでください Backbone Model#urlドキュメント 、それはすべてそこで説明されています

2
makevoid

私はbootstrap(以下をページにレンダリングすることによって)コレクションに次のように1つのモデルだけを含めます:

photos = new PhotoCollection();
photos.reset([ @Html.ToJson(Model) ]);

私が使用するサーバー側のコードはASP.NetMVCであるため、サーバー側のアーキテクチャに固有のものを使用することに注意してください。また、角括弧は、単一のモデルを取得して配列でラップするため、重要であることに注意してください。

お役に立てば幸いです。

1
timDunham