让jquery方法调用jqueryui小部件方法

时间:2013-06-07 23:17:34

标签: jquery jquery-ui oop jquery-ui-widget-factory

我使用widget工具创建了一个名为“Picklist”的jQueryUI小部件。它很棒。但是,因为它是一个小部件,所以它不响应val()方法。

我有一个循环遍历数组的函数,可以将数据分配给Web控件。在大多数情况下,我可以使用jQuery方法val()来分配值。但这对我的小部件不起作用。

我必须手动检查控件上是否存在窗口小部件,然后调用val()的窗口小部件版本来执行分配。这似乎非常低效,并且是良好的面向对象设计的对立面。

    for (var i = 0; i < ControlData.length; i++)
    {
        var mapping = ControlData[i];
        $('#' + mapping.controlName).val(mapping.value);
        if ($('#' + mapping.controlName).data('Erik-Picklist'))
        {
            $('#' + mapping.controlName).Picklist("option", { val: mapping.value });
        }
    }

有没有办法让val()映射到某个元素上的widget方法?我在想可能有一个方法可以调用将val()方法映射到Picklist的val()方法的元素,但是我还没有看到任何类似的例子。

1 个答案:

答案 0 :(得分:1)

由于没有人回应,(那将教会我在周五晚上发布一个问题)我花了很多时间试图找到一种方法来做到这一点。我能想出的最佳解决方案受到https://stackoverflow.com/a/5760684/594602

的启发

基本上,覆盖现有的val()函数,以便检查当前元素的覆盖。

$.fn.old_val = $.fn.val;
$.fn.val = function ()
{
    var ErikVal = this.data('ErikVal');
    if (ErikVal)
    {
        return ErikVal.apply(this, arguments);
    }
    else
    {
        return this.old_val.apply(this, arguments);
    }
};

在jQueryUI小部件的_create()中,我添加了以下内容:

_create: function ()
{
    ...
    this.element.data('ErikVal', function ()
    {
        this.Picklist("option", { val: arguments[0] });
    });
},

我并不为此感到特别自豪,但它正在发挥作用。