我正在构建一个应用程序,其中一个要求是大量使用热键。事实上我们想把这些热键拉回中央控制器这么重。
基本思路是每个页面都有一个与之关联的密钥。当jsf点击该键时,它将返回到一个中央枚举图,以决定哪些热键应该与该页面相关联,以及应该将哪些方法添加到该页面的键中。
我的问题是动态负载。我不能用
目前,我有这个
<h:form binding="#{hotkeyController.form}">
<f:event listener="#{hotkeyController.genKeyHandler('HOTKETEST')}" type="preRenderComponent"/>
<p:outputPanel id="displayHotkey">
<h:outputText value="#{hotkeyController.keyText}" rendered="#{not empty hotkeyController.keyText}"/>
</p:outputPanel>
</h:form>
然后,对于我的支持bean,我有这个
public void genKeyHandler(String pageKey) {
Hotkey hotkey = new Hotkey();
hotkey.setBind("ctl+shift+d");
hotkey.setAsync(true);
// "#{hotkeyController.keyHandler('HOTKETEST', 'F1')}"
hotkey.setActionExpression(createMethodExpression("#{hotkeyController.keyHandler('HOTKEYEXAMPLE', 'CTLSHIFTD')}", null,
String.class, String.class));
hotkey.setUpdate("displayHotkey");
form.getChildren().add(hotkey);
hotkey = new Hotkey();
hotkey.setBind("ctl+shift+a");
hotkey.setAsync(true);
// "#{hotkeyController.keyHandler('HOTKETEST', 'F1')}"
hotkey.setActionExpression(createMethodExpression("#{hotkeyController.keyHandler('HOTKEYEXAMPLE', 'CTLSHIFTA')}", null,
String.class, String.class));
hotkey.setUpdate("displayHotkey");
form.getChildren().add(hotkey);
}
现在,这可以实际上将热键插入到表单中。我可以在检查员看到它。但是,我的问题是双重的。一,如果我刷新页面,我会得到重复的ID错误,如果我使用preRenderView,我会得到“错误恢复组件”错误。似乎没有任何组合可行。
有没有办法让这项工作?我想要的只是在第一次加载页面时使用插入热键的bean方法,并且只在页面/视图/生活中触发一次。这应该不是那么难。
答案 0 :(得分:0)
我的建议是你使用热键的独家表格。
以下是样本:
<h:form id="mainForm">
<p:remoteCommand name="loadHotKeys" action="#{hotkeyController.genKeyHandler('HOTKETEST')}" update=":hotkeyForm" global="false" process="@this" />
<p:outputPanel id="displayHotkey">
<h:outputText value="#{hotkeyController.keyText}" rendered="#{not empty hotkeyController.keyText}"/>
</p:outputPanel>
</h:form>
<h:form id="hotkeyForm" binding="#{hotkeyController.form}" />
<script type="text/javascript">
jQuery(document).ready(loadForm());
</script>
genKeyHandler方法应该在添加热键之前清除hotkeyForm(form.getChildren().clear()
)。