Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rails3jQuery自动完成:如何扩展select函数?_Jquery_Ruby On Rails_Jquery Ui - Fatal编程技术网

Rails3jQuery自动完成:如何扩展select函数?

Rails3jQuery自动完成:如何扩展select函数?,jquery,ruby-on-rails,jquery-ui,Jquery,Ruby On Rails,Jquery Ui,我在rails3.2.8中使用rails3 jquery自动完成1.0.9 我正在尝试用自动完成来替换组合框。与组合框类似,如果用户选择一个值,我希望更新数据库中的id。与组合框一样,它也不可能选择无效值 这样做的一个方面是,如果用户开始在字段中键入,但离开字段时没有从拾取列表中选择值,则字段本身以及相应的隐藏到联系人id字段应被清除 以下是字段定义: <%= autocomplete_field_tag "to_contact_name", '', autocomplete_

我在rails3.2.8中使用rails3 jquery自动完成1.0.9

我正在尝试用自动完成来替换组合框。与组合框类似,如果用户选择一个值,我希望更新数据库中的id。与组合框一样,它也不可能选择无效值

这样做的一个方面是,如果用户开始在字段中键入,但离开字段时没有从拾取列表中选择值,则字段本身以及相应的隐藏到联系人id字段应被清除

以下是字段定义:

<%= autocomplete_field_tag "to_contact_name", '',
      autocomplete_contact_display_name_messages_path,
      :id_element => "#to_contact_id",
      :value => to_contact_name %>
<%= f.hidden_field :to_contact_id, :id => "to_contact_id" %>
问题是,当我覆盖上面的select时,默认功能不会执行,这意味着to_contact_id从一开始就不会填写

我假设我需要的是扩展select而不是重写它,那么我的代码和Rails3jQuery自动完成基本代码都会执行吗?我该怎么做?以下各种尝试要么没有被调用,要么抱怨未定义的方法:

$.extend($(this).autocomplete, {
  select: function(event, ui) {
    picklist_value_selected = true;
  }
});

最好的方法是使用自动完成。当字段模糊时,如果值已更改并让您知道选择了哪个项目(如果有的话),将触发该选项。您可以这样绑定到它:

$('input[data-autocomplete]').bind('autocompletechange', function(event, ui) {
    if(!ui.item) {
        // clear the fields
    }
});
更新:

由于我今天与它斗争了这么久,我仍然对知道如何扩展函数感兴趣

看。这是初始化自动完成的地方。select是作为自动完成选项传递的匿名函数。您可以这样扩展它,希望代码是不言自明的:

var originalSelect = $('input[data-autocomplete]').autocomplete('option', 'select');
$('input[data-autocomplete]').autocomplete('option', 'select', function(event, ui) {
    originalSelect.call(this, event, ui);
    doSomeOtherStuff();
});
然而,这不是一个好代码,因为select是一个事件,所以如果您想在调用它时做更多的事情,您可以将另一个函数绑定到它。这样,将调用原始函数和您的函数,而不会像我前面的示例中那样进行黑客攻击:

$('input[data-autocomplete]').bind('autocompleteselect', function(event, ui) {
    doSomeOtherStuff();
}); 

最好的方法是使用自动完成。当字段模糊时,如果值已更改并让您知道选择了哪个项目(如果有的话),将触发该选项。您可以这样绑定到它:

$('input[data-autocomplete]').bind('autocompletechange', function(event, ui) {
    if(!ui.item) {
        // clear the fields
    }
});
更新:

由于我今天与它斗争了这么久,我仍然对知道如何扩展函数感兴趣

看。这是初始化自动完成的地方。select是作为自动完成选项传递的匿名函数。您可以这样扩展它,希望代码是不言自明的:

var originalSelect = $('input[data-autocomplete]').autocomplete('option', 'select');
$('input[data-autocomplete]').autocomplete('option', 'select', function(event, ui) {
    originalSelect.call(this, event, ui);
    doSomeOtherStuff();
});
然而,这不是一个好代码,因为select是一个事件,所以如果您想在调用它时做更多的事情,您可以将另一个函数绑定到它。这样,将调用原始函数和您的函数,而不会像我前面的示例中那样进行黑客攻击:

$('input[data-autocomplete]').bind('autocompleteselect', function(event, ui) {
    doSomeOtherStuff();
}); 

很有帮助,谢谢。与我引用的文章中的建议几乎相同,但我忽略了ui.item实际上使用新选择的值(如果有的话)填充的事实。由于我今天与它斗争了这么久,我仍然对知道如何扩展函数感兴趣。也许真的很难?找不到好的示例。再次感谢,这两个扩展工作示例。因此,要将新函数绑定到现有事件,您需要将当前函数/事件名称混合在一起?我从来没有想到过。执行顺序是否得到保证,即我的新函数是否总是先执行?我有点喜欢黑客对执行顺序的更明显的控制和对函数的超级调用的更熟悉。我为super找到的另一种语法是,例如,return$.ui.sortable.prototype.\u init.applythis,arguments;但是我从来没有找到合适的名称空间来调用它。我只是看到rails3 jquery autocomplete的一个补丁,解决了清除值的问题,在四天前被合并并以1.0.10的形式发布。它给我带来了问题,所以我仍然使用1.0.9。请参阅此处的讨论:。非常有用,谢谢。与我引用的文章中的建议几乎相同,但我忽略了ui.item实际上使用新选择的值(如果有的话)填充的事实。由于我今天与它斗争了这么久,我仍然对知道如何扩展函数感兴趣。也许真的很难?找不到好的示例。再次感谢,这两个扩展工作示例。因此,要将新函数绑定到现有事件,您需要将当前函数/事件名称混合在一起?我从来没有想到过。执行顺序是否得到保证,即我的新函数是否总是先执行?我有点喜欢黑客对执行顺序的更明显的控制和对函数的超级调用的更熟悉。我为super找到的另一种语法是,例如,return$.ui.sortable.prototype.\u init.applythis,arguments;但是我从来没有找到合适的名称空间来调用它。我只是看到rails3 jquery autocomplete的一个补丁,解决了清除值的问题,在四天前被合并并以1.0.10的形式发布。它给我带来了问题,所以我仍然使用1.0.9。请参见此处的讨论:。