Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Autocomplete ui и this в его событиях. (https://javascript.ru/forum/jquery/60375-autocomplete-ui-i-v-ego-sobytiyakh.html)

Mister N 25.12.2015 10:25

Autocomplete ui и this в его событиях.
 
Доброго времени. У меня задача сделать что-нибудь типа вот такой вот штуки, как здесь в примере "2. Multiple choose"
Из формы нужно отправлять не введенные в инпут аутокомплита Слова, а их кодовые обозначения, причем в том порядке, в котором их выбрали. Два слова, введенные в разном порядке дают два разных результата.
Так вот, в чем у меня проблема. В виджите ui события принимают два аргумента - собственно событие event и ui - объект с данными, которые нужно ввести в инпут. Самое главное, что в this при этом DOM-объект инпута, на котором аутокомплит. Короче, я не могу написать что-то типа
$( "#tags" ).autocomplete({
      myObj:{},
      myMethod:func....
      select: function( event, ui ) {
             this.myObj[1] = ui ;
             this.myMethod(ui.label);
      }
    });

Что очень неудобно. В фабрике виджитов можно переопределить только методы, которые отрисовывают меню. _renderItem _renderMenu _resizeMenu
Можно ли каким-то образом таки расширить функционал autocomplete или для выполнения задачи нужно будет писать свой? Вроде все есть, немного дополнить остается....

рони 25.12.2015 12:55

Mister N,
<!doctype html>
<html lang="en">
<head>
   <meta charset="utf-8">
  <title>autocomplete demo</title>
  <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
  <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
  <script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>

</head>

<body>
<label for="autocomplete">Select: </label>
<input id="userSearch">
<script>
function split(val){
  return val.split( /,\s*/ );
}
var data = [{"label":"orange","id":"l_25"},{"label":"apple","id":"l_38"},{"label":"banana","id":"l_44"}];
$( "#userSearch" ).autocomplete({
  source: function( request, response ) {
          response($.map(data, function(item) {
              return {
                label: item.label,
                value: item.id
              }
            }))
      },

  select: function(event, ui){
    var terms = split(this.value);
    terms.pop();
    terms.push(ui.item.value);
    terms.push("");
    this.value = terms.join(", ");
    return false;
  },
      minLength: 0,
      cache: false
});
</script>
</body>
</html>


Часовой пояс GMT +3, время: 03:00.