ルートを設定したとします。
_'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つのモデルのプロパティをロードしたいだけの場合、これはあまりにも非効率に思えます。
コレクションの一部としてモデルがない場合は、モデルに完全なURLを手動で通知する必要があります。指定したurlRootにIDを自動追加しません。これを行うには、関数をurlRootとして指定できます。
Photo = Backbone.Model.extend({
urlRoot: function(){
if (this.isNew()){
return "/photos";
} else {
return "/photos/" + this.id;
}
}
});
バックボーンはモデルのid
を使用してモデルが新しいかどうかを判断するため、これを設定すると、このコードは正しく機能するはずです。そうでない場合は、isNewをチェックする代わりに、ifステートメントでいつでもIDをチェックできます。
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!
すでに同様の質問があります: " Backboneで単一のモデルをフェッチするにはどうすればよいですか? "
私の答えはあなたのために働くはずです(そしてそれはcoffeescriptにあります)
また、チェックすることを忘れないでください Backbone Model#urlドキュメント 、それはすべてそこで説明されています
私はbootstrap(以下をページにレンダリングすることによって)コレクションに次のように1つのモデルだけを含めます:
photos = new PhotoCollection();
photos.reset([ @Html.ToJson(Model) ]);
私が使用するサーバー側のコードはASP.NetMVCであるため、サーバー側のアーキテクチャに固有のものを使用することに注意してください。また、角括弧は、単一のモデルを取得して配列でラップするため、重要であることに注意してください。
お役に立てば幸いです。