10

mplify.requestを使用しており、サーバーとの間でデータを送受信するときに CRUD のような URL を使用したいと考えています。次に例を示します。

リソースの定義

resources = {
"document_create"           : ['/d/crud/',           "POST"],
"document_read"             : ['/d/crud/{id}',       "GET"],
"document_update"           : ['/d/crud/{id}',       "PUT"],
"document_delete"           : ['/d/crud/{id}',       "DELETE"]
};

$.each(resources, function (resource, settings) {
  definition = {
    url     : settings[0],
    type    : settings[1],
    dataType: "json",  // what comes back
    decoder : 'jsend',
    contentType: 'application/json' // what goes there
  };

  amplify.request.define(resource, "ajax", definition);
});

リソースの使用

function make_request(resource, params, success_cb, error_cb) {
 if (this.is_post(resource)) {
   // this.is_post is a test, defined elsewhere, to see if this is a POST request
   params = JSON.stringify(params);
 }

 amplify.request(
   resourceId: resource
   data: params
   success: success_cb
   error: error_cb
 );
}

これは、createandreadおよび `delete, like-so:に対して正常に機能します。

make_request('document_delete', {id: 1}, cb)

ただし、 の場合update、コンテンツが JSON として渡されるため、意図したとおりに URL 置換が行われません。

{id}上記のスキームでURL 置換を利用する方法はありますか?

私が考えることができる唯一の代替手段は、URL エンコードされたサーバーにデータを渡すことです。残念ながら、これには多少問題があります。可能であれば、CRUD のような URL の使用と JSON 形式のデータでの保存を維持できるようにしたいと考えています。

考えをいただければ幸いです。

4

2 に答える 2

9

独自のリクエスト タイプを定義することも、ただリッスンrequest.ajax.preprocessしてJSON.stringifyそこを実行することもできます。これは、URL 置換が発生した後で行います。

これis_postはおそらく現在のコードと同じで、別の場所に配置されているだけです。それは魔法の機能ではありません:)

 amplify.subscribe( "request.ajax.preprocess", function( defnSettings, settings, ajaxSettings ) {
    if ( is_post( defnSettings.resourceId ) ) {
         // This will still include the variable that matches the URL substitution:
         var _settings = $.extend( true, {}, defnSettings.data, settings.data, ajaxSettings.data );
         ajaxSettings.data = JSON.stringify( _settings );
    }
 });

あなたmake_requestはもはやそうしませんstringify

function make_request(resource, params, success_cb, error_cb) {
 amplify.request(
   resourceId: resource
   data: params
   success: success_cb
   error: error_cb
 );
}

その後、リクエストは通常​​どおり実行できます。

make_request('document_update', {id: 1, title: "New Title" }, cb)

重要:前処理呼び出しを書いた方法ではid、URL に一致しても削除されません (Amplify は通常、一致したキーを削除します)。id文字列化された JSON からを削除する場合は、_settings割り当てを次のように置き換えます。

_settings = ajaxSettings.data;
于 2012-05-30T14:39:26.277 に答える
8

Amplify 1.1.0 の時点で、リソースを定義するときに dataMap オプションがあります。ハッシュオブジェクトの代わりに関数を渡すと、増幅はリクエストに渡された生データでこの関数を呼び出します。

この例では、JSON.stringify を dataMap オプションに渡します。

amplify.request.define("paqueteput", "ajax", {
    url: "/api/paquetes/{id}",
    dataType: "json",
    type: "PUT",
    contentType: "application/json; charset=utf-8",
    dataMap: JSON.stringify
});


// later we pass a raw object that gets stringified to JSON
var savePaquete = function(paquete, cb) {
    amplify.request({
         resourceId: "paqueteput",
         data: paquete,
         success: cb.sucess,
         error: cb.error
    });
};

私が本当に好きではない唯一のことは、増幅がデータ オブジェクトから URL にマップされたキーを削除することです。この場合、id プロパティは URL に存在しますが、最終的な JSON から削除されます。

この動作を制御するには、増幅にオプションが必要です!

于 2013-02-07T18:18:57.830 に答える