我使用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()方法的元素,但是我还没有看到任何类似的例子。
答案 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] });
});
},
我并不为此感到特别自豪,但它正在发挥作用。