私はBackboneを使って簡単なTODOプラグインを構築しようとしていて、AJAX APIの問題にぶつかっています。正しいAJAXコールバックを取得するには、次のように "action"パラメータを渡す必要があります。
admin-ajax.php?action = get_todos
これはBackboneのGETメソッドではうまく機能します。ただし、DELETEを使用している場合、Backboneはデフォルトで次のようなURLを使用します。
admin-ajax.php?action = get_todos/9
ここで、 "9"は削除されている仕事のIDです。このIDを追加することで、WordPress側のAJAX呼び出しが中断されます。各メソッドのURLを手動でオーバーライドすることはできますが、AJAX APIをBackboneで使用するためのより洗練された方法があるかどうかを知りたいです。
これまでに実行した特定の問題を示すデモプラグインを作成しました。設定ページを読み込み、ネットワークインスペクタを見ながらXのいずれかをクリックして、WordPressからの0の値AJAXの結果を確認します。
https://github.com/hereswhatidid/wordpress-todo-backbone-demo
AJAX呼び出しに使用されるURLを変更するには、Backbone.sync
関数をオーバーライドする必要があります。あなたはプラグインから学ぶことができます wp-backbone これ以上。その下から、すべてのアクションをPOST
またはGET
に変更し、パラメータを作成し、action
パラメータを追加するなどの方法がわかります。
(function($) {
Backbone.sync = function(method, model, options) {
var params = _.extend({
type: 'POST',
dataType: 'json',
url: wpBackboneGlobals.ajaxurl,
contentType: 'application/x-www-form-urlencoded;charset=UTF-8'
}, options);
if (method == 'read') {
params.type = 'GET';
params.data = model.id
}
if (!params.data && model && (method == 'create' || method == 'update' || method == 'delete')) {
params.data = JSON.stringify(model.toJSON());
}
if (params.type !== 'GET') {
params.processData = false;
}
params.data = $.param({action:'backbone',backbone_method:method,backbone_model:model.dbModel,content:params.data});
// Make the request.
return $.ajax(params);
};
})(jQuery);
Backbone.syncは、オプションとして渡したパラメータを使用して独自の$ .ajaxリクエストをオーバーライドするため、Backbone.sync
をオーバーライドする必要はありません。 Backbone.sync
が内部でどのように機能するのかについてのチュートリアルは、このリンクを参照してください。 http://backbonejs.org/docs/backbone.html#section-141
モデルやコレクションに次のようなものを追加できます。
save: function(){
var $params = {
emulateJSON: true,
data: {
action: 'your_wp_ajax_action',
payload : this.toJSON()
}
};
//return $.post(this.url, $params, null);
return Backbone.sync( 'create', this, $params );
}
そして、そのデータをサーバー側で通常の投稿データとして処理します(あなたのモデルを$_POST['payload']
に入れた状態で)。
このメソッドは以下のことを行います。
emulateJSON
パラメータを指定して 'classic POST'をオンにします。フロントエンドとバックエンドの両方でシンタックスシンタックスになります。それ以外の場合は、 'data'パラメータにJSON.stringifyを使用する必要があります。$_POST['payload']
には、すべてのBackboneデータの配列が含まれています。