动态添加Primefaces Hotkey控件

时间:2014-01-07 15:01:15

标签: jsf-2 primefaces

我正在构建一个应用程序,其中一个要求是大量使用热键。事实上我们想把这些热键拉回中央控制器这么重。

基本思路是每个页面都有一个与之关联的密钥。当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方法,并且只在页面/视图/生活中触发一次。这应该不是那么难。

1 个答案:

答案 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())。