12

私は次のモデルを持っています:

window.MyModel = Backbone.Model.extend({
     initialize: function(props){
          this.url = props.url;
     } 

     parse: function(){

          // @override- parsing data fetched from URL
     }


});

 // instantiate
  var mod = new MyModel({url: 'some/url/here'});

このグローバル変数'mod'を使用して、バックエンドからこのモデルにデータをフェッチします。

 // fetch

 mod.fetch({
       success: function(){ ...},
       error: ...

 });

上記のすべてがうまく機能します...私の問題:URLのリセットを変更してフェッチを呼び出すことでこのモデルを再利用したいのですが、どういうわけかURLが更新されません。私は以下を試しました:

  mod.fetch({ 
       data: {url:'/some/other/url'},
       postData: true,
       success: function(){ //process data},
       error: ...
  });


 mod.set({url: '/some/other/url'});
 // called fetch() without data: and postData: attributes as mentioned in previous

fetch()を呼び出して、更新されたURLからデータをフェッチできるように、モデルのURLを設定するにはどうすればよいですか?私は何かが足りないのですか。ポインタをありがとう。

更新1:基本的に、更新した値を取得できません

    model.set({url: 'new value'}); 

に続く

    model.fetch();

「モデル」はグローバル変数です。'model'の新しいインスタンスを作成すると、次のように機能します。

    model = new Model({url:'/some/other/url'}); 
    model.fetch();

ただし、必要に応じて機能します。これは、モデルインスタンスが永続的にURLにアタッチされており、リセットできないことを意味しますか?

UPDATE1の質問への回答モデルインスタンスはURLに永続的に添付されていません。動的にリセットできます。理解を深めるために、@ tkoneの詳細な説明を読んでから、@fguillensのソリューションを読んでください。

4

4 に答える 4

24

@tkoneの説明を理解した後...

それでもダイナミクスが必要なModel.url場合は、いつでもその構築を実行時間まで遅らせることができます。これを試してください。

window.MyModel = Backbone.Model.extend({
  url: function(){
    return this.instanceUrl;
  },
  initialize: function(props){
    this.instanceUrl = props.url;
  } 
}
于 2012-07-28T10:39:11.397 に答える
11

ここでの答えは、あなたがやりたいということです。

mod.url = '/some/other/url'

URLはモデル自体のインスタンスの一部ではなく、MyModelモデルインスタンスの作成元のオブジェクトの属性です。したがって、通常のJavaScriptオブジェクトプロパティのように設定するだけです。 set設定している(または逆に取得しているget)データが実際にサーバーとの間で送受信するデータの属性である場合にのみ使用されます。

しかし、なぜURLを変更するのかは、私たちが尋ねるべき質問です。Backboneのモデル/コレクションシステムの背後にある考え方は、RESTエンドポイントと話し、各モデルに対応するエンドポイントがあるということです。

あなたがブログを持っていて、そのブログには「エントリー」オブジェクトがあり、それは次の場所で入手できます。

/rest/entry/

そして、エントリー用のバックボーンモデルがあります。

Entry = Backbone.Model.extend({urlBase: '/rest/entry'});

これで、あなたsaveまたはfetchバックボーンがこれがどのように機能するかを知ったとき。

つまり、新しいモデルを作成しているように:

e = new Entry();
e.set({title: "my blog rulez", body: "this is the best blog evar!!!!1!!"});
e.save();

/rest/entryこれにより、Backboneは本体を使用してHTTPPOSTリクエストを実行します。

{
  "title": "my blog rulez",
  "body": "this is the best blog evar!!!!1!!"
}

mod.set({url: '/some/other/url'});実際にデータセットに呼び出されるフィールドを追加しているurlので、サーバーは"url": "/some/other/url"上記のJSONPOST本文の一部として送信します。

{
  "title": "my blog rulez",
  "body": "this is the best blog evar!!!!1!!",
  "url": "/some/other/url" 
}

次に、サーバーは同じモデルのHTTP 200(または201)応答で応答しますが、たとえば、IDが付加されているだけです。

{
  "id": 1,
  "title": "my blog rulez",
  "body": "this is the best blog evar!!!!1!!"
}

そして、それはあなたが探しているものではありませんよね?)

これで、このモデルが作成され、IDが作成されました。これは、変更した場合、次のことを意味します。

e.set('title', 'my blog is actually just ok');
e.save()

/rest/entry/1バックボーンは、サーバー上のリソースを更新するためにHTTPPUTリクエストを行うようになりました。

サーバーは、エンドポイントでID 1について話していること/rest/entry/を認識しているため、既存のレコードを更新する(そしてHTTP 200を送り返す)ことを認識しています。

TL; DR

URLを変更しないでください。Backboneが変更します。新しいデータの新しいモデルを作成します。

于 2012-07-27T19:33:19.640 に答える
4
model.urlRoot = "/your/url"

また

model.urlRoot = function(){ return "/your/url"; }

また

model.url = "/your/url"

また

model.url = function(){ return "/your/url"; }

Backbone.Modelオブジェクトのデフォルトの「url」プロパティは次のとおりです。Backbone.jsドキュメントによると:

サーバー上のモデルの表現のデフォルトURL-BackboneのRESTfulメソッドを使用している場合は、これをオーバーライドして、呼び出されるエンドポイントを変更します。

url: function() {
  var base = getValue(this, 'urlRoot') || getValue(this.collection, 'url') || urlError();
  if (this.isNew()) return base;
  return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id);
},

明らかに、最初にurlRootの値を取得します。使用できない場合は、モデルが属するコレクションのurlを調べます。urlの代わりにurlRootを定義することにより、urlRootがnullの場合にコレクションurlにフォールバックするという利点があります。

于 2012-07-30T16:55:36.337 に答える
2

次のように、フェッチ関数のオプションとしてurlを設定できます。

var mod = new MyModel();
mod.fetch({
   url: '/some/other/url',
   data: {}
});
于 2017-03-13T16:15:40.243 に答える