2011-10-25 5 views
2

私はモデルを取得するたびに "id"属性を設定するためにBackbone.syncをオーバーライドしようとしています。このようにして、fetch()がidで応答しなくても、次のmodel.save()が更新を起動し、を作成しないと確信しています。Backbone.syncをオーバーライド

Backbone._sync = Backbone.sync; 
Backbone.sync = function(method, model, options) { 
    var params = _.clone(options); 
    params.success = function(model) { 
     if(method == 'read' && model.isNew()) { 
      var id = Math.floor(Math.random()*1000); 
      model.set({ "id": id }); 
     } 
     if(options.success) options.success(model); 
    }; 
    Backbone._sync(method, model, params); 
} 

しかし、成功関数に渡されたモデルは、バックボーンモデルではなく、オブジェクトであるようです。だから、私はそれにmodel.isNew()のようなメソッドを使用することはできません。私が間違っていたことのアイデア?

答えて

7

Backbone.syncではなく、Model.fetchまたはModel.parseを上書きすることができます。 Backbone.sync$.ajax()のオプションしか必要としないため、successコールバックはインスタンス化されたモデルではなく、サーバーからJSON応答を受信して​​いるだけです。

デフォルトModel.fetch()コールバックは、次のようになります。あなたが意図したとおり

options.success = function(resp, status, xhr) { 
    if (!model.set(model.parse(resp, xhr), options)) return false; 
    if (success) success(model, resp); 
}; 

ここmodelは、現在のインスタンスを参照します。そこで、Model.fetchをオーバーライドして、IDがない場合にはそれを上書きするか、おそらくはより良い方法で、model.parse()を上書きすることを検討してください。これはデフォルトではパススルーであり、サーバーデータを変更するためのフックです。私は乱数IDの実装に興奮していません。衝突の可能性があります。特に、たくさんのモデルを作成している場合は、model.cid(クライアントでは一意であることが保証されていますが、

parse: function(resp, xhr) { 
    if (this.isNew() && !resp.id) { 
     resp.id = _.uniqueId('model-'); 
    } 
} 
+0

合意。 'Backbone.sync'はあなたのトランスポート/プロトコルに関するものです。あなたはあなたの技術に "作成"、 "更新"などの動詞をマップするためにそれを上書きします。デフォルトで 'Backbone.sync'はHTTP/RESTですが、他のもの(Socket.ioやローカルストレージなど)が必要な場合は、それを変更することができます。データを使って(IDを設定するなど)何かをしたいのであれば、あなたが示唆しているようにモデル内で起こるはずです。 –

+0

非常に完全な答えは、私の問題を解決しました。どうもありがとう。 –

+0

@BrianGenisio parseとfetchの両方の成功のコールバックの使い方を教えてください。私はパースを使ってメタデータを分離し、次にレンダリングロジックを成功させたいと考えています。しかし、私がmodel.parseを定義すると成功コールバックは決して呼び出されません。 – BlackDivine

1

@nrabinowitz

ただ、これに明確にするより多くの量を小さな追加する:サーバー提供のID)またはアンダースコアの_.uniqueId()と。私はJSONをサポートしているRedbeanPHPを使用しています。 1つの問題は、オブジェクトを作成するときに、そのオブジェクトの新しいIDをresultタグに返します。編集する場合は、新しいオブジェクトに対してこれを必要とすることです。

// My model object is a User. (we are all Users in some way). 
    var User = Backbone.Model.extend(
      { 
       url : "/user/rpc", 
       defaults: { 
        email: "email", 
        password: "", 
        admin: 0 
       },parse: function(resp, xhr) { 
           // check if the model is new, if so, set the id of this model for future requests so RedBean knows the id of this object. 
        if(this.new()){ 
        this.set({"id":resp.result}); 
        console.log(this); 
          } 
       } 

      } 
     ); 
+0

ここで何をしているのか分かりません。実際、私の問題は設計上の問題でした。なぜなら、最良の方法はIDサーバー側を生成してそれを返すことだと思います。その後、バックボーンは自動的にIDをモデルに設定します。あなたはなぜ結果全体をIDとして設定しますか?また、使用しているmodel.new()構文は何ですか? –

関連する問題