Как добавить дополнительные параметры для моего обратного вызова Ajax?

Думаю, я мог бы сделать это... не лучшим образом. Но он работает, и результат возвращается в моем объекте данных. Теперь мне нужно передать некоторые дополнительные параметры. Как я могу вызвать handleData() с дополнительными параметрами? Я пробовал это:

handleData({'likes' : true})

Но это удаляет объект data, который возвращается из вызова Ajax.

Вот мой код:

// My global Ajax function to 'set' data
$.fn.setData = function(url, params){
 return $.ajax({
 url: site_url + url,
 type: "POST",
 dataType: 'json',
 data: params
 });
} 
function registerLike() {
 var like = $('.interaction .like')
 var status = $(like).data('status');
 var count = $(like).data('count');
 like.click(function(){
 if(!liked){
 // I need to pass adition parameters here
 like.setData('action/like', {'id' : id}).done(handleData());
 } else {
 // and here
 like.setData('action/unlike', {'id' : id}).done(handleData());
 }
 });
 function handleData(data){
 if(data.success) {
 if(data.likes){
 count = count+1;
 liked = 1;
 } else {
 if(count > 0) {
 count = count-1;
 } else {
 count = 0;
 }
 liked = 0;
 }
 $('.interaction .like .icon').toggleClass('el-icon-heart');
 $('.like-count').html(count);
 }
 }
}
2 ответа

Вы всегда можете создать оболочку с анонимной функцией:

like.setData('action/unlike', {'id' : id}).done(function(response){
 myCallback(response, extraData);
});


Предложение Амира является хорошим. Однако он обобщен в Function.bind

like.setData('action/unlike', {'id' : id}).done( 
 myCallback.bind(this, extraData) 
);

Обратите внимание, что ваша функция будет называться как myCallback(extraData, response), а не myCallback(response, extraData). Если вам действительно нужно extraData, которое будет передано после аргументов времени вызова, вы можете реализовать свою собственную привязку, которая добавляет связанные аргументы, а не добавляет их.

Ext-JS имеет функцию связывания, которая позволяет вам выбирать, куда вставлять связанные аргументы.

/**
 * Create a new function from the provided `fn`, change `this` to the provided scope, optionally
 * overrides arguments for the call. (Defaults to the arguments passed by the caller)
 *
 * {@link Ext#bind Ext.bind} is alias for {@link Ext.Function#bind Ext.Function.bind}
 *
 * @param {Function} fn The function to delegate.
 * @param {Object} scope (optional) The scope (`this` reference) in which the function is executed.
 * **If omitted, defaults to the default global environment object (usually the browser window).**
 * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
 * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding,
 * if a number the args are inserted at the specified position
 * @return {Function} The new function
 */
bind: function(fn, scope, args, appendArgs) {
 if (arguments.length === 2) {
 return function() {
 return fn.apply(scope, arguments);
 };
 }
 var method = fn,
 slice = Array.prototype.slice;
 return function() {
 var callArgs = args || arguments;
 if (appendArgs === true) {
 callArgs = slice.call(arguments, 0);
 callArgs = callArgs.concat(args);
 }
 else if (typeof appendArgs == 'number') {
 callArgs = slice.call(arguments, 0); // copy arguments first
 Ext.Array.insert(callArgs, appendArgs, args);
 }
 return method.apply(scope || Ext.global, callArgs);
 };
},

См. http://docs-origin.sencha.com/extjs/4.2.2/#!/api/Ext.Function-method-bind

licensed under cc by-sa 3.0 with attribution.