我已经搜索过这个,但到目前为止还没有找到重复的,我可能使用了错误的关键字......
我正在尝试临时更改存储在对象中的函数,但无法将其设置回原来的状态。
考虑一下:
// Set the options object
var options = {
success: function(){
console.log('Original Function Called');
}
}
// Save the options
$('#foo').data('bar',options);
然后在另一个函数中:
// Get the options
var options = $('#foo').data('bar');
// Store the old options
var old_options = options;
// Temporarily change the success function
options.success = function(){
console.log('Temporary Function Called');
}
// Save the options
// This allows the other functions to access the temporary function
$('#foo').data('bar',options);
// Do stuff here that uses the new options
// Reset the options to include the original success function
$('#foo').data('bar',old_options);
我本来希望只显示Temporary Function Called
一次,但是,它似乎success
用临时回调完全替换了旧回调。
谁能告诉我为什么以及如何解决这个问题?
更新
我认为这extend
可以解决这个问题,但似乎问题可能更深一些。这次我决定发布我的实际代码片段。阅读前请注意以下事项:
SM
几乎只是 的别名jQuery
,请忽略它。success
并且error
是提供给函数的参数
这是我的代码:
// Get the properties
var properties = $(form).data('autosave');
switch(parameter){
case 'save':
var old_properties = $.extend({},properties);
// Set the new callbacks if they have been supplied
properties.options.success = typeof success!=='undefined' ? success : old_properties.options.success;
properties.options.error = typeof error!=='undefined' ? error : old_properties.options.error;
// Save the properties
$(form).data('autosave',properties);
// Call the save method before setting the interval
SM(form)._as_save();
properties = $.extend({},old_properties);
// Save the old properties
$(form).data('autosave',properties);
// Clear the current interval
clearInterval(properties.interval);
// Call the save method periodically
properties.interval = setInterval(function(){
SM(form)._as_save();
},properties.options.interval);
break;
}
// Save the properties
$(form).data('autosave',properties);