6

RESTfulバックエンドに接続するバックボーンアプリを作成しています。モデルでsave()を呼び出すと、投稿データが文字列化されたJSONとして送信されます。

{"firstName":"first","lastName":"last","Email":"email@gmail.com"}

しかし、私のサーバーはそれがクエリ文字列のようにフォーマットされていることを期待しています:

firstName=first&lastName=last&Email=email@gmail.com

バックボーンに別の方法で送信させる方法はありますか?

4

6 に答える 6

8

バックボーンは、箱から出してこのようなものを提供しません。
ただし、必要に応じてオーバーライドおよびカスタマイズするのは簡単です。

ソースコードをご覧ください:http: //documentcloud.github.com/backbone/docs/backbone.html

呼び出しを確認すると、バックグラウンドsaveで呼び出しがトリガーsyncされます。

したがって、必要なのは、Backbone.sync関数を独自のものでオーバーライドすることです。

私は次の部分を変更します:

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

if (!options.data && model && (method == 'create' || method == 'update')) {
      params.contentType = 'application/json';
      params.data = $.param(model); // <-- CHANGED 
}

jQueryパラメータを使用していることに注意してください

カスタム関数を使用する場合は、次の質問を確認してください 。Javascriptオブジェクトのクエリ文字列エンコーディング

[更新]
直接変更する必要はありません。独自の関数「Backbone.sync」でオーバーライドすることをお勧めします。Backboneリポジトリの「TODO」の例を確認してください。localStorage.jsBackbone.sync関数をオーバーライドするファイルがありますhttps://github.com/documentcloud/backbone/tree/master/examples

于 2012-07-10T19:47:49.387 に答える
2

私は仕事でこの問題に遭遇し、Backbone.emulateJSONも私のために機能しませんでした。いくつかの助けを借りて、私はこの回避策を思い付くことができました。Backbone.ajax関数をオーバーライドし、contentTypeを「application / x-www-form-urlencoded」に変更し、$。paramを使用してデータを適切にシリアル化しました。

Backbone.ajax = function() {
    if(arguments[0].data && arguments[0].contentType == "application/json"){
        arguments[0].data = $.param(JSON.parse(arguments[0].data));
        arguments[0].contentType = "application/x-www-form-urlencoded";
    }
    return Backbone.$.ajax.apply(Backbone.$, arguments);
}
于 2013-11-18T22:37:42.787 に答える
0

多分これはあなたを助けることができます、試してみてください:http: //backbonejs.org/#Sync-emulateJSON

于 2012-07-10T15:44:26.297 に答える
0

モデルの同期関数をオーバーライドすることでこれを行いました。

var MyModel = Backbone.Model.extend({ 
    "sync": function(method, model, options) {
        if (method == "update" || method == "create") {
            options = options ? _.clone(options) : {};
            options['data'] = $.param(this['attributes']);
        }
        var arguments = [method, model, options];
        return Backbone.sync.apply(this, arguments);
    }
});
于 2013-03-14T11:47:30.580 に答える
0

私は解決策を見つけます、参照してください:

  1. 私が使う

    Backbone.emulateJSON = true;

  2. 私は「更新」の場合を書きます:

    options.url = "/user/"+Math.random(1, 1000);
    options.type = "POST";
    //.1/2 WORK
    //options.data = (model instanceof Backbone.Model)?model.toJSON():{};
    options.data = model.toJSON();
    break;
    
于 2013-05-17T15:39:13.240 に答える
0

Backbone.syncはjQuery.ajax関数を使用するため、(beforeSendを介して)サーバーに送信されるjqXHRまたはデータを変更できます。

var oldSync = Backbone.Model.prototype.sync;
var SomeModel = Backbone.Model.extend({
    url: 'test.json',

    defaults: {
        id: 1,
        foo: 'test'
    },

    sync: function (method, model, options) {
        // options are passed to the jQuery.ajax
        _.extend(options, {
            emulateHTTP: true,
            emulateJSON: false,
            beforeSend: function(xhr, settings) {
                // settings.data is a body of our request.
                if (_.isString(settings.data)) {
                    // settings.data is a JSON-string like '{"id":1, "foo":"test"}'
                    settings.data = Backbone.$.parseJSON(settings.data);
                }

                settings.data = Backbone.$.param(settings.data);
                // settings.data is 'id=1&foo=test'
            }
        });

        oldSync.apply(this, arguments);
    }
});

var model = new SomeModel();
model.save();

実際にミックスインを作成できます!:)

于 2014-09-17T13:33:43.233 に答える