2015-09-09 1 views
6

У меня есть следующее меню для выбора. но чувствительный к регистру не работает. когда я нажимаю малый а или капитал А, он всегда показывает малый а (в зависимости от того, что произойдет раньше).<p: selectOneMenu caseSensitive = "true">, похоже, не имеет никакого эффекта

 <p:selectOneMenu id="tempSelect" caseSensitive="true"> 
         <f:selectItem itemLabel="0" itemValue="0"/> 
         <f:selectItem itemLabel="a" itemValue="a"/> 
         <f:selectItem itemLabel="A" itemValue="A"/> 
         <f:selectItem itemLabel="b" itemValue="b"/> 
     </p:selectOneMenu> 

Мое правление версии 5.2.

Когда поле выбора находится в фокусе. Я нажимаю букву алфавита «a» или нажимаю букву буквы «A», в обоих случаях она показывает только «a» в поле (потому что она встречается сначала в списке). Это фактическое поведение.

Ожидаемое поведение: когда я нажимаю «a», он помещает «a», и когда я нажимаю «A», он помещает «A» в поле.

Что мне делать?

+0

вы можете положить пример вашего фактического поведения и ожидаемый один? Можете ли вы также уточнить, что вы имеете в виду с *, когда я нажимаю маленький или капитал A, он всегда показывает малый а (в зависимости от того, что произойдет раньше). *? Спасибо –

+0

, когда поле выбора находится в фокусе. Я нажимаю букву алфавита «a» или нажимаю букву буквы «A», в обоих случаях она показывает только «a» в поле (потому что она встречается сначала в списке). Это фактическое поведение. Мое ожидаемое поведение заключается в том, что когда я нажимаю «a», он помещает «a», и когда я нажимаю «A», он помещает «A» в поле –

+0

. Вы можете попробовать с автокомпонентом http://www.primefaces.org/ showcase/ui/input/autoComplete.xhtml –

ответ

6

Primefaces 5.2 documentation (страница 430) говорит о опции: -CaseSensitive командлет

Определяет, если фильтрация будет чувствительно к регистру.

Таким образом, этот параметр применяется только в том случае, если вы используете filter = "true" и только для значений, которые вы вводите в поле фильтра.

Когда вы фокусируетесь на элементе управления SelectOneMenu и вводите значение, поиск всегда будет нечувствительным к регистру, как вы можете видеть в source code of Primefaces (line 848). Обратите внимание, что тексты помещаются в LowerCase перед сравнением.

return $(this).text().toLowerCase().indexOf(text.toLowerCase()) === 0; 

Один из способов (не очень элегантно) вам решить эту проблему Переопределение Primefaces функция, которая отвечает за этот фильтр. Помните, что в этом случае другие элементы управления SelectOneMenu на одной странице также будут чувствительны к регистру.

Так линия 848 стала бы так:

return $(this).text().indexOf(text) === 0; 

Еще одна деталь, которая, вероятно, следует считать (если вы действительно хотите переписать функцию), что на line 842 of source code, Primefaces отбрасывает все записи, которые имеют сдвиг ключ.

metaKey = e.metaKey||e.ctrlKey||e.shiftKey; 

Таким образом, эта линия также должна быть изменена, как ниже, чтобы облегчить ввод заглавных букв:

metaKey = e.metaKey||e.ctrlKey; 

Таким образом, учитывая эти два изменения, и final version of Primefaces 5.2 (minified), решение просто добавить следующее код где-то после SelectOneMenu.

<script> 
    PrimeFaces.widget.SelectOneMenu.prototype.bindKeyEvents = function() { 
     var a = this; 
     this.focusInput.on("keydown.ui-selectonemenu", function(d) { 
      var c = $.ui.keyCode, b = d.which; 
      switch (b) { 
      case c.UP: 
      case c.LEFT: 
       a.highlightPrev(d); 
       break; 
      case c.DOWN: 
      case c.RIGHT: 
       a.highlightNext(d); 
       break; 
      case c.ENTER: 
      case c.NUMPAD_ENTER: 
       a.handleEnterKey(d); 
       break; 
      case c.TAB: 
       a.handleTabKey(); 
       break; 
      case c.ESCAPE: 
       a.handleEscapeKey(d); 
       break 
      } 
     }).on(
       "keyup.ui-selectonemenu", 
       function(g) { 
        var f = $.ui.keyCode, d = g.which; 
        switch (d) { 
        case f.UP: 
        case f.LEFT: 
        case f.DOWN: 
        case f.RIGHT: 
        case f.ENTER: 
        case f.NUMPAD_ENTER: 
        case f.TAB: 
        case f.ESCAPE: 
        case f.SPACE: 
        case f.HOME: 
        case f.PAGE_DOWN: 
        case f.PAGE_UP: 
        case f.END: 
        case f.DELETE: 
        case 16: 
        case 17: 
        case 18: 
        case 224: 
         break; 
        default: 
         var i = $(this).val(), c = null, h = g.metaKey 
           || g.ctrlKey; 
         if (!h) { 
          clearTimeout(a.searchTimer); 
          c = a.options.filter(function() { 
           return $(this).text() 
             .indexOf(i) === 0 
          }); 
          if (c.length) { 
           var b = a.items.eq(c.index()); 
           if (a.panel.is(":hidden")) { 
            a.selectItem(b) 
           } else { 
            a.highlightItem(b); 
            PrimeFaces.scrollInView(
              a.itemsWrapper, b) 
           } 
          } 
          a.searchTimer = setTimeout(function() { 
           a.focusInput.val("") 
          }, 1000) 
         } 
         break 
        } 
       }) 
    } 
</script> 

Чтобы проверить, помните, что есть a timer of 1 second между каждым нажатием клавиши, чтобы очистить кэш писем, которые были введены и начать новое слово.

+0

Спасибо .. это сработало :) –

2

Хотя это не идеальное решение, вы можете использовать это обходное решение. Используйте фильтр. Таким образом вам нужен еще один «клик», но он работает.

<p:selectOneMenu id="tempSelect" caseSensitive="true" filter="true" filterMatchMode="startsWith"> <f:selectItem itemLabel="0" itemValue="0"/> <f:selectItem itemLabel="a" itemValue="a"/> <f:selectItem itemLabel="A" itemValue="A"/> <f:selectItem itemLabel="b" itemValue="b"/> </p:selectOneMenu>

Смежные вопросы