Пользовательский компонент JSF теряет фокус ввода при обновлении ajax

Я пишу настраиваемый компонент автозаполнения в качестве учебного упражнения с JSF 2.1.3. Идея (которая, вероятно, довольно знакома) состоит в том, чтобы ввести текст в и входной компонент и представляет собой список с соответствующими значениями. Идея иметь событие javascript keyup на входе, которое вызывает jsf.ajax.request () для обновления компонента. Пока у меня есть компонент, который я могу включить, например это:

<mycc:autocomplete id="myauto" searchMethod="#{bean.doSearch}"/>

Это отображает html следующим образом:

<span id="myauto">
  <input type="text" id="myauto_input" name="myauto_input"
    onkeyup="com.myco.ajaxRequest(this, event)"/>
  <select id="myauto_listbox" name="myauto_listbox">
    <option value="1st">First</option>
    <option value="2nd">Second</option>
  </select>
</span>

Функция javascript (keyup) com.myco.ajaxRequest () делает следующее:

jsf.ajax.request(comp, null, {
                 execute: 'myauto',
                 render: 'myauto'
                 });

Итак, потому что я хочу перестроить и повторно визуализировать список с предложениями list, я повторно визуализирую пользовательский компонент myauto. Указав выполнение: 'myauto' выполняется метод decode (), и я могу получить входное значение. От указав render: 'myauto' методы encode ... () выполняются для регенерации html.

Это нормально, но поскольку я визуализирую родительский элемент myauto_input компонент, я теряю фокус ввода каждый раз, когда срабатывает событие keyup.

Если я укажу что-то вроде render: 'myauto_listbox' (я действительно хочу только в конце концов перерисовать список) проблема в том, что методы encode ... () не выполняются, потому что они предназначены для пользовательского компонента в целом, а не только список. И это будет в одном из методов encode ... (), которые я перестраиваю список, содержащий предложения.

Компонент расширяет UIInput, и я генерирую разметку в отдельном рендерере (componentFamily = "javax.faces.Input") в методе encodeEnd () (так что это всегда запускается после любого поставляемого преобразователя - еще не реализовано). Я предполагаю что принудительный фокус из javascript - ужасный взлом, и его следует избегать.

Я немного не уверен, что с этим делать, но подозреваю, что то, что я вижу указывает на то, что я как-то неправильно подхожу к этому. Если кто-то было бы достаточно, чтобы указать мне в правильном направлении, я буду очень признателен это.

6
задан Shog9 23 July 2014 в 22:40
поделиться