バックボーンで単一のモデルをフェッチするにはどうすればよいですか?


93

私は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/

APIでバックアップされたクロックを1つだけ取得するにはどうすればよいですか?


私見それはコレクションに属しています。Collection#fetchOne(id、callback)のようなもの。
ジュリアンマイチャー

回答:


26

2番目のアプローチは、私が使用したアプローチです。以下をClockモデルに追加してみてください:

url : function() {
  var base = 'clocks';
  if (this.isNew()) return base;
  return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id;
},

このアプローチは、そう、のようなあなたのURLにhashbangとコントローラを実装していることを前提としhttp://www.mydomain.com/#clocks/123、それはあなたがまだいない場合でも動作するはずです。


3
バックボーンモデルのドキュメントdocumentcloud.github.com/backbone/#Model-url
makevoid

@makevoid yourコーヒースクリプトまたはドキュメントの例で提供した例を機能させることができませんでした。Andrewの例は機能し、foo.url()を使用して例を提供できます。常に関数のURLがないことを通知します。
Roberto Alarcon、2011

@makevoid参照しているメソッドは、モデルがコレクションで作成されている場合にのみ機能するようです。のコレクションに注目してください[collection.url]/[id]
Steven Devijver 2014年

@makevoid有効なリンクを提供できますか?残念ながら、これは今のところ壊れています
AlexNikolaev94

ここに作業リンクがあります(彼らはドキュメントを移動しました!うわー、5年が経過しました、 geez ): backbonejs.org/#Model-url-@StevenDevijverは正しいです
makevoid

137

モデルでurlRootを指定してみてください:

ドキュメントから:

var Book = Backbone.Model.extend({urlRoot : '/books'});
var solaris = new Book({id: "1083-lem-solaris"});
solaris.fetch();

2
これは良いことですが、モデルを再インスタンス化したくない場合もあります。同じモデルに対して特定のアイテムをフェッチする場合は、サイレントセットを実行できますcurrentBook.set('id', 13423, {silent:true})。これは、あまりにも動作しますが、私はわから理由はないよ:currentBook.id = 13423
SimplGy

1
@SimplGyは、model.idと本質的に同義であるため機能しmodel.attributes.idます。を呼び出すとmodel.set('id')、Backboneはmodel.id指定したものに設定されます。そして、model.idモデル固有のURLを作成するときに使用されますものです。
ランバート、2015

26

私は個人的に、Model#urlメソッドのドキュメントに従ってお勧めします

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を変更せずに、モデルが更新され、ビューがレンダリングされます

注:申し訳ありませんが、この例はコーヒースクリプトで出てきましたが、jsステートメントにvarステートメントを追加することで簡単に変換できます。


どうやらこれは動作しません。モデル(またはコレクション)でfetchを呼び出すときに、サーバーを呼び出さないでください
Ricardo Amores

これは問題ないように見えますが、コレクションが本当に必要ない場合は、コレクションラインがぎこちなく見えます。
ディングル2013

これを機能させることができませんでした:this.model.get( 'field')。モデルが作成されたように見えるサブオブジェクト
Muhaimin

1
this.model.bind( "change"、this.render、this)はうまく機能しました
dmi3y

1
はい@UlysseBN、あなたは、VAR文を追加することができます(2011年だった){}の内側に()渡されたオブジェクトと、オプションのための;広告の行の終わり
makevoid

12
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 !!!


2
これは@Hernanと同じソリューションです
ブレンデン

0

...モデルurlRootの末尾のスラッシュが不要な場合は、次のようにします。

    url : function() {                        
        return this.urlRoot + this.id;
    },

0

おそらく、コレクションを介してオブジェクトにアクセスし、常にコレクション内に保持する必要があります。これを行う方法は次のとおりです。

var AllClocks = Backbone.Collection.extend({
  model: Clock,
  url: '/clocks/'
});

var allClocks = new AllClocks();
my_clock = allClocks.add({id: 123});
my_clock.fetch()

2
あなたはそれを知りません。多分彼が必要とするすべては1つの時計です。クライアントにユーザーレコードの単一のモデルを提示したいとしますか?彼はすべてのユーザーのコレクションにもアクセスできますか?ユースケースを非公開にしようとするとき、時々人々はいくつかのアドバイスを必要とします。ただ答えなさい。
エイドリアンバーソロミュー2015

0

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());

次に、モデルで「idAttribute」を「postId」として設定した後にのみ、正しいURLを取得できます。このような:

var PostModel = Backbone.Model.extend({
    idAttribute: 'postId',
    urlRoot: 'getBlogPost',
    defaults: {
        postTitle: "defaultTitle",
        postTime: "1970-01-01",
        postContent: "defaultContent",
        postAuthor: "anonymous"
    }
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.