3

メソッドを拡張するための最良の方法は何ですか?model.save

同じデータをバックエンドに投稿するための新しいメソッドを追加する必要があります。すなわち:playedメソッドは(POSTによって)要求する必要がありますapiurl/model/:id/played

例えば:

var Game = Backbone.Model.Extend({
   baseUrl: '/games/',
   played: function(){
      this.url = this.baseUrl + this.id + '/played' 
      this.save();
   }
}); 

var game = new Game({id:3234});  //is only an example, instances are created before previuosly
game.played();

この方法は機能していますが、リクエストはGETです。さらに、これがsave()リクエスト内のすべての属性を送信しなかった場合は完璧です。

情報の追加: クロスドメインAPIを操作する必要があるため、JSONPを操作するためにsyncメソッドを拡張しました。さらに、いくつかのセキュリティ手順を追加しました。

//backbone sync
Backbone._sync = Backbone.sync;
Backbone.sync = function(method, model, options) {
    //network
    options.timeout = 10000;
    options.dataType = "jsonp";  
    //security
    if(_conf.general.accessToken){
        var ak = _conf.general.accessToken, 
        url = model.url,
        linker = url.indexOf('?') === -1 ? '?':'&';
        model.url = url + linker + 'accessToken=' + ak+'&callback=';    
    }
    //error manager
    var originalError = options.error || function(){};
    options.error = function(res){
        originalError(res.status, $.parseJSON(res.responseText));
    };
    //call original Method 
    Backbone._sync(method, model, options);  
};
4

1 に答える 1

5

Backbone の save メソッドと fetch メソッドは Backbone.sync メソッドを呼び出すだけで、これは ajax 呼び出しの単なるラッパーです。save 関数を使用して、実際に拡張しなくても ajax パラメータを渡すことができます。基本的には次のようになります。

game.save({attributes you want to save}, {type:'POST', url: 'apiurl/model/:id/played'});

ただし、毎回これを行う必要があるため、モデルの Backbone.sync を拡張することをお勧めします。

バックボーンの Web サイトには、バックボーンの同期と ajax オプションの保存に関する私が話していることについての情報が少しあります。同期の拡張で見た例もいくつかありますが、現時点では追跡できないようです。

于 2012-05-31T21:45:20.290 に答える