0

For mapping my backbone models to what I get from the server I am using a technique described on the GroupOn Dev blog: https://engineering.groupon.com/2012/javascript/extending-backbone-js-to-map-rough-api-responses-into-beautiful-client-side-models/

However, this only maps incoming data to the model.

I would like this to go both ways, so that when I save a model, it prepares the models attributes to match the servers model.

What would be the best solution to prepare the output of the model?

4

2 に答える 2

2

サーバーの応答が投稿できるものとまったく異なるという、まったく同じ問題に遭遇しました。Backbone.sync オブジェクトの仕組みの中で、Backbone.sync の次のステートメントでカスタム JSON オブジェクトをサーバーにポストできる方法を発見しました。

if (!options.data && model && (method == 'create' || method == 'update')) {
  params.contentType = 'application/json';
  params.data = JSON.stringify(model.toJSON());
}

sync は、options.data が存在しないかどうかを評価し、params.data を文字列化されたモデルに設定します。options.data チェックは私を締め出しました。それが存在する場合、同期はモデルの代わりにそれを使用します。これを踏まえて、model.save を上書きして、サーバーが期待する属性ハッシュを渡すことができるようにしました。

これが私がそれを上書きした方法です:

save : function(key, value, options) {
    var attributes = {}, opts = {};

    //Need to use the same conditional that Backbone is using
    //in its default save so that attributes and options
    //are properly passed on to the prototype
    if (_.isObject(key) || key == null) {
        attributes = key;
        opts = value;
    } else {
        attributes = {};
        attributes[key] = value;
        opts = options;
    }

    //In order to set .data to be used by Backbone.sync
    //both opts and attributes must be defined
    if (opts && attributes) {
        opts.data = JSON.stringify(attributes);
        opts.contentType = "application/json";
    }

    //Finally, make a call to the default save now that we've
    //got all the details worked out.
    return Backbone.Model.prototype.save.call(this, attributes, opts);
}

では、あなたの場合、これをどのように使用しますか?基本的に、マッピングを逆にして結果の JSON を返すメソッドを作成します。次に、次のようにビューまたはコントローラーから保存を呼び出すことができます。

getReversedMapping : function() {
    ver reversedMap = {};
    ...
    return reversedMap;
},
saveToServer : function() {
    this._model.save(this.getReverseMapping, {
        success : function(model, response) {
            ...
        },
        error : function(model, response) {
            ...
        }
    })
}

オーバーライドされた保存により、渡された JSON が options.data に自動的にコピーされるため、Backbone.sync はそれを使用して投稿します。

于 2012-08-02T18:24:35.383 に答える
0

ブレンダン・デランパの答えは機能しますが、物事が複雑すぎます。

save メソッドでこれを行わないでください。これらのパラメータ チェックを毎回コピーする必要はありません (バックボーンで何らかの変更があった場合はどうすればよいでしょうか?)。

代わりに、モデルの同期メソッドを次のように上書きします。

var MyModel = Backbone.Model.extend({
    ...,
    sync: function (method, model, options) {
        if (method === 'create' || method === 'update') {

            // get data from model, manipulate and store in "data" variable
            // ...

            options.data = JSON.stringify(data);
            options.contentType = 'application/json';
        }

        return Backbone.Model.prototype.sync.apply(this, arguments);
    }
});

サーバー対応の形式でデータを「準備」する必要がある場合は、これですべてです。

于 2013-08-04T15:33:52.517 に答える