Пользовательское клиентское событие из составного компонента - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь использовать общую логику, которую все пользовательские компоненты, или, что еще лучше, пользователи пользовательских компонентов могут использовать для выполнения после того, как компонент завершил свою работу AJAX.Эта операция может завершиться ошибкой на сервере, поэтому обязательно, чтобы выполнение пользователя выполнялось, когда все закончено и успешно выполнено.

Так что я пошел в направлении поведения клиента.Но я застрял, так как мой предоставленный код возвращает только предоставленный ответ, а javascript не выполняется.

<?xml version='1.0' encoding='UTF-8'?>
<partial-response id="j_id1"><changes><update id="j_id1:javax.faces.ViewState:0"><![CDATA[142571433633527695:1304613666692082786]]></update></changes></partial-response>

Сейчас я могу сделать следующее:

  1. addClientBehaviorвыполняется
  2. выполняется действие
  3. super.queueEvent выполняется с ожидаемым javascript onevent
  4. ответ не выполняет javascript

ComponentBeh.java

@Slf4j
@FacesComponent("ComponentBeh")
public class ComponentBeh extends UINamingContainer implements ClientBehaviorHolder {

    @Override
    public void addClientBehavior(final String eventName, final ClientBehavior behavior) {
        super.addClientBehavior(eventName, behavior);
        log.info("Adding eventName {}", eventName);
    }

    @Override
    public Collection<String> getEventNames() {
        return Collections.singletonList("myEvent");
    }

    public void action() {

        log.info("Action triggered.");

        final List<ClientBehavior> clientBehaviors = getClientBehaviors().get("myEvent");
        if (CollectionUtils.isNotEmpty(clientBehaviors)) {
            final ComponentBehEvent componentBehEvent = new ComponentBehEvent(this, clientBehaviors.get(0));
            super.queueEvent(componentBehEvent);
        }
    }
}

ComponentBehEvent.java

public class ComponentBehEvent extends AbstractAjaxBehaviorEvent {

        public ComponentBehEvent(final UIComponent component,
                                 final Behavior behavior) {
            super(component, behavior);
        }
    }

component-beh.xhtml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><!--
  ~ Copyright © 2019 by Parsek d.o.o.
  ~ All Rights Reserved.
  -->
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
                xmlns:cc="http://xmlns.jcp.org/jsf/composite"
                xmlns:h="http://xmlns.jcp.org/jsf/html"
                xmlns:f="http://xmlns.jcp.org/jsf/core"
>
    <cc:interface componentType="ComponentBeh">
        <cc:clientBehavior name="myEvent" default="true"/>
    </cc:interface>
    <cc:implementation>
        <h:commandButton value="doit">
            <f:ajax listener="#{cc.action}"/>
        </h:commandButton>
    </cc:implementation>
</ui:composition>

component-beh-test.xhtml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<!--
  ~ Copyright © 2019 by Parsek d.o.o.
  ~ All Rights Reserved.
  -->
<ui:composition template="/layout/sdk-layout.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
                xmlns:h="http://xmlns.jcp.org/jsf/html"
                xmlns:v="http://vitaly.parsek.com/showcase"
                xmlns:f="http://xmlns.jcp.org/jsf/core">

    <ui:define name="content">
        <section class="surface">
            <div class="group">
                <h:form>
                    <h1>Component</h1>
                    <v:component-beh>
                        <f:ajax event="myEvent" onevent="alert('yo')"/>
                    </v:component-beh>
                </h:form>
            </div>
        </section>
    </ui:define>
</ui:composition>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...