2013-07-04 5 views
9

Backbone JSモデルのデフォルト動作ではのコレクションのURLを返します。具体的には、モデルurlRootが指定されていない限り、が指定されています。私は動作を動作させるように見えることはできません。BackboneJS model.url using collection.url

ドキュメントから:

model.url()...形式のURLを生成します: "[collection.url]/[ID]" デフォルトでは、しかし、あなたが明示的に指定することによって無効にすることができますモデルのコレクションを考慮しない場合はurlRoot。ここで

それぞれ私のコレクション、そしてモデルです:

var MyCollection = Backbone.Collection.extend({ 
    model: Model, 
    initialize: function(options){ 
     this.options = options || {}; 
    }, 
    url: function(){ 
     return "/theurl/" + this.options.param; 
    } 
}); 
return MyCollection; 

...

var MyModel = Backbone.Model.extend({ 
    urlRoot: '/theurl', 
    initialize: function() { 
    } 
}); 
return MyModel; 

モデルが収集せずにロードされると、それは素晴らしい作品と/theurlに提出したが、コレクションにロードされると、すべてのメソッドが/theurl/param/に送信されます。

ドキュメントを正しく理解している場合は、モデルのurlRootがこの動作を上書きする必要があります。モデルURLは/theurl/param/{MODEL-ID}である必要があります。

私が紛失/誤解していることに関するアイデアはありますか?

...

PS:コレクションからmodel: Modelは、それは常にあなたがurlRootを指定した場合でも、コレクションのURLを使用しますRequireJS

答えて

9

経由でもたらされます。

urlRootの理由は、オーバーライドでモデルを使用したり、モデルがコレクションにない場合(たとえば、削除されてもクライアント上に残っているなど)です。

は、だから、fetchまたはsaveモデルにしたいとあなたがオプションとして明示的にこれらのメソッドにurlRootに合格する必要がありますコレクションによって生成されたURLをオーバーライドします。例:

yourModel.save({ url: yourModel.urlRoot }); 

私はこのドキュメントが混乱していることに同意しています。

+0

感謝を。ドキュメントはあまりにもあいまいです。モデルURLをコレクションURLの末尾に追加しない理由についてのアイデアはありますか? – caleb

+0

いくつかあります。あなたはクライアント上でモデルを作成しましたか?そうであれば、IDはサーバーにまだ保存されていないため、必ずしもIDを持つ必要はありません。この場合、それはcIdを持つだけです。 – dcarson

+2

これは代わりに 'yourModel.save({}、{url:yourModel.urlRoot});'と言うべきだと思います。現在書かれている方法は、 'save'の最初の引数が属性ハッシュであるため、オブジェクトの' url'プロパティを 'set'することになります。 – flyingL123

1

UrlRootは関数であり、モデルはattributeIdである必要があります。 モデルをこのように定義すると、モデルが収集されているかどうかにかかわらず、すべての操作が機能します。

バックボーンの追加modelIdの末尾にurlRootが返されます。

var MyModel = Backbone.Model.extend({ 
    attributeId: 'myModelId' 
    urlRoot: function() { 
     return '/theurl'; 
    }, 
    initialize: function() { 
    } 
    defaults: { 
     myModelId: null 
    } 
}); 
+0

私はちょうど 'urlRoot'を文字列ではなく関数として設定し、モデルがコレクション内にあってモデルの' save'が呼び出されたときにモデルの 'urlRoot'関数を使わなかったことをテストしました。 – dcarson

+0

モデルがコレクションにある場合、コレクションURLが使用されます。 urlRootは、モデルがコレクションの外にある場合のみです。 – maketest

+0

まさに!その行動は、質問をしている人が、彼/彼女に予期せぬように質問していたものでした。ドキュメントは混乱していて、 'urlRoot'を設定すると、コレクション内であっても**常にurlRootを使用するモデル**を意味することが示唆されています。私が私の答えで言ったように、そしてあなたのコメントでちょうど言ったように、これは事実ではありません。 – dcarson

0

モデルでは、使用してみてください:答えを

url: function() { 
    return 'your url goes here'; 
}