Вызов события нажатия клавиши f:ajax, но только при нажатии клавиши со стрелкой влево

Есть ли смысл сделать так, чтобы следующее событие вызывало запрос ajax только по стрелке влево и в противном случае действовало нормально.

<h:selectOneMenu id="menuId" value="#{bean.value}" converter="entityConverter">
        <f:selectItem noSelectionOption="true" itemLabel="All Categories"/>
        <f:selectItems  value="#{bean.valueList" var="value" 
            itemLabel="#{value.subcatName}" itemValue="#{value}"/>
            <f:ajax event="keydown"
                    listener="#{bean.goBack()}"
                    execute="@this"                                 
                    render="@form"
                    onevent="function(data) { if (data.status === 'begin') { //is there something I can do here?}}"/>
</h:selectOneMenu>

person Landister    schedule 07.07.2014    source источник


Ответы (1)


Поскольку вы используете Primefaces, воспользуйтесь его утилитой p:remoteCommand. Он создает функцию javascript, которую можно использовать для выполнения запросов ajax. В вашем случае это может быть:

@ManagedBean
@ViewScoped
public class SelectionBean implements Serializable {

    private List<String> values = Arrays.asList("val1", "val2");

    private String selection;

    public String getSelection() {
        return selection;
    }

    public void setSelection(String selection) {
        this.selection = selection;
    }

    public List<String> getValues() {
        return values;
    }

    public void goBack() {
        System.out.println("Going back...");
    }

}
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

<h:head />

<h:body>

    <h:form>
        <p:remoteCommand name="goBack"
            actionListener="#{selectionBean.goBack}" />
        <script>
            function processKey(e) {
                if (e.keyCode == 37) {
                    goBack();
                }
            }
        </script>
        <h:selectOneMenu value="#{selectionBean.selection}"
            onkeydown="processKey(event);">
            <f:selectItems value="#{selectionBean.values}" />
        </h:selectOneMenu>
    </h:form>

</h:body>
</html>

Здесь мы используем вспомогательную функцию JS, которая проверяет, является ли событие keyCode событием для стрелки влево. Если true, вызовите сгенерированную Primefaces JS-функцию, которая вызовет метод на стороне сервера.

person Xtreme Biker    schedule 07.07.2014
comment
Спасибо, Xtreme, похоже, это то, что мне нужно сделать. Мы старались максимально избегать простых лиц только потому, что они, кажется, оказывают довольно большое влияние на производительность, но это должно сработать. - person Landister; 07.07.2014
comment
@Landister, я протестировал решение, прежде чем публиковать его с PF 4 и Mojarra 2.1.28. PF уже находится в версии 5.0, так что я думаю, что это достаточно зрелый фреймворк для использования, с множеством ошибок, которые исправляются от этапа к этапу. Очевидно, он загружает стили и изображения CSS, а также файл JS, но, по-моему, это не должно вас беспокоить, если вы правильно включите просмотр кеша в производственных средах. - person Xtreme Biker; 07.07.2014