バックボーンにClock
モデルがあります:
var Clock = Backbone.Model.extend({});
/clocks/123
から最新の情報を含むインスタンスを取得しようとしています。私が試したいくつかのこと:
Clock.fetch(123)
// TypeError: Object function (){ ... } has no method 'fetch'
fetch
を呼び出します:c = new Clock({id: 123})
c.fetch()
// Error: A 'url' property or function must be specified
AllClocks
コレクションリソースを作成してみました(ページ上でそのようなものを使用することはありませんが)。
var AllClocks = Backbone.Collection.extend({
model: Clock,
url: '/clocks/'
});
var allClocks = new AllClocks();
allClocks.fetch(123);
// returns everything from /clocks/
one API-backed Clockを取得するにはどうすればよいですか?
2番目のアプローチは、私が使用したアプローチです。クロックモデルに次を追加してみてください。
url : function() {
var base = 'clocks';
if (this.isNew()) return base;
return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id;
},
このアプローチは、 http://www.mydomain.com/#clocks/12 のようにURLにhashbangを使用してコントローラーを実装していることを前提としていますが、まだ行っていなくても動作するはずです。
モデルで rlRoot を指定してみてください:
ドキュメントから:
var Book = Backbone.Model.extend({urlRoot : '/books'});
var solaris = new Book({id: "1083-lem-solaris"});
solaris.fetch();
Model#url method documentation に従って個人的にお勧めします
model = new Model(id: 1)
view = new View(model: model)
collection = new Collection([model])
model.fetch()
コレクションにコレクションURLを追加することを忘れないでください:
url: "/models"
そしてあなたのビューの初期化関数で:
this.model.bind("change", this.render)
これにより、バックボーンは次のURLを使用してajaxリクエストを実行します。
"/models/1"
collection#urlまたはModel#urlRootを変更せずに、モデルが更新され、ビューがレンダリングされます
注:ごめんなさい、この例はコーヒースクリプトで出てきましたが、varステートメントを追加するjsに簡単に変換できます
var Person = Backbone.Model.extend({urlRoot : '/person/details'});
var myName = new Person({id: "12345"});
myName.fetch();
その結果、Ajaxリクエストを
URL http://[domainName]/person/details/id
jSONレスポンスが返されます。
Enjoiiii !!!
RESTfulなURLを使用したいのですが、「postId」をベースURLに追加できない理由を理解できませんでした。
var PostModel = Backbone.Model.extend({
urlRoot: 'getBlogPost',
defaults: {
postTitle: "defaultTitle",
postTime: "1970-01-01",
postContent: "defaultContent",
postAuthor: "anonymous"
}
});
var post = new PostModel({
postId: 1
});
alert(post.url());
次に、Modelで「idAttribute」を「postId」として設定した後にのみ、正しいURLを取得できるかどうかがわかります。このような:
var PostModel = Backbone.Model.extend({
idAttribute: 'postId',
urlRoot: 'getBlogPost',
defaults: {
postTitle: "defaultTitle",
postTime: "1970-01-01",
postContent: "defaultContent",
postAuthor: "anonymous"
}
});
おそらく、コレクションを通じてオブジェクトにアクセスし、常にコレクション内に保持する必要があります。これはそれを行う方法です:
var AllClocks = Backbone.Collection.extend({
model: Clock,
url: '/clocks/'
});
var allClocks = new AllClocks();
my_clock = allClocks.add({id: 123});
my_clock.fetch()
...モデルurlRootの末尾のスラッシュが必要ない場合は、これを実行します。
url : function() {
return this.urlRoot + this.id;
},