2013-01-18 5 views
5

Backbone.Model.save呼び出しを正しく作成する際に問題が発生しています。私が呼んでいるウェブサービスはURLパラメータを消費しますが、私がJavascriptで持っているものは、変更されたフィールドのオブジェクトです。たとえば、私はオブジェクト{foo: 'bar', yar: 'har'}を持っていて、Backbone.Model.saveがURLにパッチリクエストを送るようにします。Backbone.Model.save(パッチ= true)のJSONとURLパラメータのエンコーディング

サウンドはシンプルですね。それはとにかく私に一束のトラブルを与えている。

object = 
    foo: 'bar', 
    yar: 'har' 

model.save object, 
    patch: true 

私はいくつかを試してみた:;(私は、成功/エラーコールバックを持って、あまりにも、私は、これらの質問のために重要であるとは思わない動作しません)ここで私はこれまで持っているものですあまりにも他のオプション:

model.save object, 
    patch: true 
    emulateJSON: true 

このセットのcontentTypeを "アプリケーション/ x-www-form-urlencodedで"、良いですが、Backbone.syncによってAJAXリクエストで送信されたデータがあった:{モデル: " {"foo": "bar"、 "yar": "har"} "。サービスはそれを持っていて、 "モデル"プロパティで何をすべきか分かりません。

model.save object, 
    patch: true 
    contentType: "application/x-www-form-urlencoded" 

これだけのコードの文字列と詰め込むなどobjectoptions.dataにその。再び、サービスはそれをどうしたらいいのか分からない。

これを私のサービスの仕様に準拠させる方法は他にもありますか?私は自分自身を呼び出すことができ、モデル(とそれが属しているコレクション)を自分自身で更新することができますが、実際にはそうしないでしょう。私の作品のAjaxリクエストは次のとおりです。

$.ajax 
    url: "http://server/path/to/service" 
    type: "PATCH" 
    data: object 

更新:私の以前の2つのオプションが機能しなかった理由はBACKBONE.JS自体に明確である:

// Ensure that we have the appropriate request data. 
if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) { 
    params.contentType = 'application/json'; 
    params.data = JSON.stringify(options.attrs || model.toJSON(options)); 
} 

// For older servers, emulate JSON by encoding the request into an HTML-form. 
if (options.emulateJSON) { 
    params.contentType = 'application/x-www-form-urlencoded'; 
    params.data = params.data ? {model: params.data} : {}; 
} 

これを見ると、I私はoptions.dataにオブジェクトにオブジェクトを詰め、空の属性で送信された場合は、おそらくそれが仕事だろう、多分考えた:

model.save {}, 
    patch: true 
    data: object 

どうやらこれがしようとしました"[オブジェクトオブジェクト]"オプションを選択してください。私はそれがオブジェクトのstringifyを行ったと思います...どこか...これは正しい答えに近いでしょうか?

答えて

2

jQuery.ajaxにはprocessDataオプションがあります。 Backbone.syncは、デフォルトでは次のことを行います。したがって、それは私のためのURLパラメータにオブジェクトを処理していませんでした

// Don't process data on a non-GET request. 
if (params.type !== 'GET' && !options.emulateJSON) { 
    params.processData = false; 
} 

(jQuery API)

ので、コードの作業ビットは次のようになります。真実で

model.save {}, 
    patch: true 
    data: object 
    processData: true 

、私は全体的に正しくBackbone.Modelを使用することはできません...しかし、少なくともそれが働いています。 :P

関連する問題