【发布时间】:2011-11-01 11:32:10
【问题描述】:
我正在编写一个自动完成自定义组件作为 JSF 的学习练习 2.1.3。这个想法(可能很熟悉)是将一些文本输入 并输入组件并显示具有匹配值的列表框。这个想法是 在调用 jsf.ajax.request() 的输入上有一个 keyup javascript 事件 更新组件。到目前为止,我已经有了一个可以包含的组件 这个:
<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>
com.myco.ajaxRequest() javascript 函数(keyup)这样做:
jsf.ajax.request(comp, null, {
execute: 'myauto',
render: 'myauto'
});
所以因为我想重建并重新呈现带有建议的列表框 列表,我正在重新渲染自定义组件“myauto”。通过指定执行: 'myauto' decode() 方法执行,我可以得到输入值。经过 指定 render: 'myauto' 执行 encode...() 方法以重新生成 html。
这一切都很好,但是因为我正在渲染 myauto_input 的父级 每次触发 keyup 事件时,我都会失去输入焦点。
如果我指定类似 render: 'myauto_listbox' 的内容(我只是真的想 毕竟重新渲染列表框)问题是编码...()方法 不要执行,因为它们是针对整个自定义组件的,而不仅仅是 列表框。它将在我重建的一种编码...()方法中 包含建议的列表框。
组件扩展了 UIInput,我在单独的渲染器中生成标记 (componentFamily = "javax.faces.Input") 在 encodeEnd() 方法中(所以这个 总是在任何提供的转换器之后运行 - 尚未实现)。我想 从 javascript 强制焦点是一种可怕的 hack,应该避免。
我有点不确定该去哪里,但我怀疑我所看到的 表明我以某种错误的方式处理这个问题。如果有人 足以为我指明正确的方向,我将不胜感激 它。
【问题讨论】:
标签: javascript ajax jsf custom-component