将值从一个回调传递到另一个回调

时间:2016-01-30 15:57:51

标签: javascript jquery

我创建了以下主要适用的插件。它需要xeditable,但允许jQueryUI的自动完成选择值。它主要工作,但是,我正在努力如何将返回的id从jQueryUI自动完成传递给成功回调。

如何将jQueryUI自动完成选择回调中的值传递给xeditable成功回调?

EDIT。我得到了它的工作,但认为它有点像kludge。这样做的正确方法是什么?

编辑#2。编辑#2。有关演示,请参阅Writing R Extensions manual

$('#targetID').xeditableAutoSource({
    source: 'getSource.php',
    success: function(response, newValue) {
        console.log($(this).data('uid')); //This is the value I want!
    }
});

(function($){

    var defaults = {
        source: [],     //Replace with URL
        placement: 'right',
        title: 'XEditable Title',
        success: function(response, newValue) {}    //id will be $(this).data('uid')
    };

    var methods = {
        init : function (options) {
            var settings = $.extend({},defaults, options  || {});

            this.each(function () {

                var $this=$(this).editable({
                    //send:'never',
                    placement:settings.placement,
                    title:settings.title,
                    success: settings.success
                })
                .on('shown', function(e, editable) {
                    var $input=editable.input.$input.val('');
                    var $button=$input.parent().next().find('button.editable-submit').css('opacity', 0.3)
                    .bind('click.prevent', function() {return false;});
                    $input.focus(function() {
                        $button.css('opacity', 0.3).bind('click.prevent', function() {return false;});
                    })
                    .autocomplete({
                        source: settings.source,
                        select: function(e, ui) {
                            $input.blur();
                            $button.css('opacity', 1).unbind('click.prevent');
                            $this.data('uid',ui.item.id);  //This is the value I need in the success callback!
                        }
                    })
                    .autocomplete('widget').click(function() {return false;});
                });

            })
        },
        destroy : function () {
            return this.each(function () {
                return this.each(function () {});
            });
        }
    };

    $.fn.xeditableAutoSource = function(method) {
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || ! method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method ' +  method + ' does not exist on jQuery.xeditableAutoSource');
        }    
    };
    }(jQuery));

1 个答案:

答案 0 :(得分:0)

代码太多......据我所知,你想要传递一个函数,不仅仅是一个回调,还有它的参数。您可以尝试以下技术:

var f1 = function(callback) {      //we will pass a callback to this function
  callback()
}
var f2= function(param1) {         //that will be our callback
  console.log(param1) 
}

var p = 'Callback will always be called with this parameter'
f1(  function() { f2(p) }  )       //here we pass f2 with p as a callback to f1

回调及其​​参数包含在匿名函数中。 ' F1'和' f2'是您图书馆的功能,您不必修改它们,需要它们来说明技术。

如果接受回调的函数将一些其他参数传递给它,那么通过一些小的更改就可以使它工作:

var f1 = function(callback) {
  var p1 = 'Parameter set by f1'
  callback(p1)
}
var f2= function(param1, param2) {
  console.log(param1 +' '+ param2) 
}

var p = 'Constant parameter'
f1(  function(p1) { f2(p1, p) }  )