web-dev-qa-db-ja.com

Backboneで単一のモデルを取得するにはどうすればよいですか?

バックボーンに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を取得するにはどうすればよいですか?

93
James A. Rosen

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を使用してコントローラーを実装していることを前提としていますが、まだ行っていなくても動作するはずです。

26

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

ドキュメントから:

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

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に簡単に変換できます

26
makevoid
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 !!!

12
Ankit Garg

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"
    }
});
0
Araell

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

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

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

...モデルurlRootの末尾のスラッシュが必要ない場合は、これを実行します。

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