web-dev-qa-db-ja.com

コレクションのURLを設定する方法

私が持っているとしましょう:

_var Book = Backbone.Model.extend();

var Collection = Backbone.Collection.extend({
  model: Book,
  url: '/books',
  initialize: function(){
    this.fetch();
  })
})
_

新しいコレクションをインスタンス化するときにCollectionurlを変更するにはどうすればよいですか?

var AdventureBooks = new Books({ url: '/books/adventure' })は機能しません

_var AdventureBooks = new Books({ category: 'adventure' })
_

そして、コレクション定義では:

_url : '/books/' + this.category_も機能しません。

ありがとう。

35
Running Turtle
var Book = Backbone.Model.extend({
  "url": function() {
    return '/books/' + this.get("category");
  }
});
28
Raynos

以下が機能するはずです。

var AdventureBooks = new Books();
AdventureBooks.url = '/books/adventure';
39
ponzao

何らかの理由で、コレクションコンストラクターに渡されるパラメーター(「url」など)がオブジェクトに設定されていません。このコレクションでは、そのうちのわずか(モデルおよびコンパレーター)のみを使用します。

コンストラクタを介してURLを渡す場合は、オブジェクトに必要なパラメーターをコピーするinitializeメソッドを作成する必要があります。

var Book = Backbone.Model.extend({
    initialize: function(props) { 
        this.url = props.url;
    }
}
var book = new Book({url: "/books/all"});
13
Juha Palomäki

Daniel Patz 指摘 のように、問題はコレクションをインスタンス化する方法にあります。私は今これに少し苦労しているので、質問はいくぶん古くても、これを更新すると思いました。

最初の引数はモデルの配列であることが期待され、オプションは後に続きます。これは動作するはずです:

var AdventureBooks = new Books([], { url: '/books/adventure' })

動的URLが必要な場合は、Raynosの答えが道のりかもしれません。

9
Ruy Diaz

コレクションに動的なURLが必要な場合は、これを試してください(バックボーン1.1.2でテスト済み):

バックボーンコレクションのインスタンスを作成し、動的urlパラメーターをオプションとして渡します(オプションオブジェクトは2番目の引数である必要があります。最初の引数はオプションのモデルの配列です)。

var tweetsCollection = new TweetsCollection(null, { userId: 'u123' });

次に、コレクション内で、optionsオブジェクトの値を使用する動的url関数を作成します。

var TweetsCollection = Backbone.Collection.extend({
    url: function() {
        return '/api/tweets/' + this.options.userId;
    },
    model: TweetModel
});
3
chrisweb

私にとって最良の解決策は、初期化メソッドです。この例を見てください。

Entities.MyCollection = Backbone.Collection.extend({
    model: Entities.MyModel,
    initialize: function(models,options) { 
        this.url = (options||{}).url || "defaultURL";
    },
}

次のように使用します。

var items = new Entities.MyCollection();                     //default URL
var items = new Entities.MyCollection([],{url:'newURL'});    //changed URL
2
Pavel Sedek

私はこれが遅い返信であることを知っていますが、私は同じように少し複雑ですが、選択された答えは本当に私を助けませんでした。

条件コレクションがあり、各実験モデルには複数の条件があり、URLを/ api/experiments /:experimentId/conditionsにする必要がありましたが、空のConditionsコレクションからexperimentIdにアクセスする方法がわかりませんでした。

条件コレクションのurl関数でconsole.log(this.toJSON())を実行し、Backboneが作成時に渡した属性を使用して空のコレクションに単一のダミーモデルを挿入することを発見しました。

そう:

var Conditions = new ConditionsCollection({
  experimentId: 1
});

私はこれがベストプラクティスと見なされることをどういうわけか疑っています。他の誰かがより良い解決策で応答することを願っていますが、ここに私のコレクションを定義した方法があります

var ConditionsCollection = Backbone.Collection.extend({
  model: Condition,
  url:  function(){
    var experimentId = this.at(0).get("experimentId");
    return "/api/experiments/" + experimentId + "/conditions";
  }
});
1
ckot

私のためのこの作業(バックボーン1.2.1でテスト済み):

var serverData = Backbone.Collection.extend({
url: function() {
    return '//localhost/rest/' + this.dbname;
},
constructor: function(a) {
    if(a.dbname){
        this.dbname = a.dbname;
    }
    Backbone.Collection.apply(this, arguments);
}
});

次のように使用します。

var users = new serverData({dbname : 'users'});
0
Pavel B