2013-08-11 5 views
1

Я пытаюсь расширить управление автозаполнением kendo-ui: я хочу, чтобы поиск начинался, когда пользователь нажал кнопку ввода, поэтому в основном я должен проверить ввод пользователя на событие keydown. Я попытался поймать KeyDown событие с этим кодом:kendo-ui autocomplete extend

(function($) { 
    ui = kendo.ui, 
    Widget = ui.Widget 
    var ClienteText = ui.AutoComplete.extend({ 
     init: function(element,options) { 
      var that=this; 
      ui.AutoComplete.fn.init.call(this, element, options);     
      $(this).bind('keydown',function(e){ console.log(1,e); }); 
      $(element).bind('keydown',function(e){ console.log(2,e); }); 
     }, 
     options: { 
      [...list of my options...] 
     }, 
     _keydown: function(e) { 
      console.log(3,e); 
      kendo.ui.AutoComplete.fn._keydown(e); 
     } 
    }); 
    ui.plugin(ClienteText); 
})(jQuery); 

Ни один из переплетены событий не получает называется, только _keydown, а затем я делаю что-то неправильно и не может вызвать автозаполнения «нормальный» KeyDown мероприятие. Я видел много примеров, которые расширяют базовый виджет, а затем создают составной виджет, но я не заинтересован в этом, я хочу только добавить функциональность существующего виджета. Может ли кто-нибудь показать мне, что я делаю неправильно?

Спасибо!

+0

Выполнение этого в функции инициализации: '$ (элемент) .bind ('KeyDown', функция (е) { вар KControl = $ (это) .data ('kendoClienteText'); , если (e.which === 13) { kcontrol.setDataSource (datasource_clientes); kcontrol.search ($ (это) .val());} еще { kcontrol.setDataSource (нуль); } }); ' на самом деле делать то, что я хочу, но я не уверен, что это правильный способ сделать это. Любое предложение приветствуется! (извините за форматирование кода) –

+0

Я до сих пор не вижу в вашем коде, как вы прекращаете «официальный» кендо-автозаполнение контрольного вызова? – Vojtiik

+0

$ (element) .bind ('keydown', function (e) {...}) сделать магию, я поставлю код, который фактически работает в ответе внизу. –

ответ

1

Этот код на самом деле работает:

(function($) { 
    ui = kendo.ui, 
    ClienteText = ui.AutoComplete.extend({ 
     init: function(element,options) { 
     ui.AutoComplete.fn.init.call(this, element, options);     
     $(element).bind('keydown',function(e){ 
      var kcontrol=$(this).data('kendoClienteText'); 
      if (e.which === 13) { 
      kcontrol.setDataSource(datasource_clientes); 
      kcontrol.search($(this).val()); 
      } else { 
      kcontrol.setDataSource(null); 
      } 
     }); 
     }, 
     options: { 
     name: 'ClienteText', 
     } 
    }); 
    ui.plugin(ClienteText); 
    })(jQuery); 

, но я не знаю, если это правильный способ сделать это.

+0

FYI ... когда я впервые попробовал это, у меня «превышен максимальный размер стека вызовов». Оказывается, я забыл блок «options». HTH кто-то еще. – RMorrisey

2

Что об уходе удлинять и воспользоваться сборки в настройках и методов на существующем управления: http://jsfiddle.net/vojtiik/Vttyq/1/

//create AutoComplete UI component 
var complete = $("#countries").kendoAutoComplete({ 
    dataSource: data, 
    filter: "startswith", 
    placeholder: "Select country...", 
    separator: ", ", 
    minLength: 50 // this is to be longer than your longest char 
}).data("kendoAutoComplete"); 

$("#countries").keypress(function (e) { 
    if (e.which == 13) { 
     complete.options.minLength = 1; // allow search 
     complete.search($("#countries").val()); 
     complete.options.minLength = 50; // stop the search again 
    } 
}); 
+0

Это хорошая идея, но в этом случае я должен создать функцию нажатия клавиш для всех элементов управления или заполнить класс, а затем сделать $ ('. Myclass'). Keypress и т. Д., Я хочу расширить элемент управления, потому что например, не только я хочу сделать $ ('# myinput'). myControl() и иметь возможность иметь сложный элемент управления, записывающий код внутри элемента управления, а не снаружи. –