尽管多次问过这个问题,但是建议的解决方案对我不起作用。
因此,我尝试再次询问。我在6.2版中使用了primefaces,并在6.2.10版中使用了primefaces扩展进行了测试]
我当前的代码是:我不明白的是remoteCommand和javaScript如何交互并将“结果”(resultx)值发送到Bean方法...我什至尝试了其他星座,但是每次日志为空时,请在打印Java脚本时始终打印预期的结果。
XHTML:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:H="http://java.sun.com/jsf/html"
xmlns:pe="http://primefaces.org/ui/extensions"
>
<p:panel header="Quest Panel" id="questEditPanel">
<p:diagram id="diagram" value="#{questChart.model}" style="height:1200px" styleClass="ui-widget-content" var="el">
<f:facet name="element">
<h:outputText id="questName" value="#{el.questName}" style="display:block; margin-top:1em;"/>
<p:commandLink onclick="setClickedSpanElement(this)" >
<p:graphicImage name="woodenui/gear.png" width="20" height="20"/>
</p:commandLink>
</f:facet>
<pe:remoteCommand name="execAssignment" action="#{questChart.setResult}">
<pe:methodSignature parameters="java.lang.String" />
<pe:methodParam name="resultx" />
</pe:remoteCommand>
<p:remoteCommand name="execAssignment2" actionListener="#{questChart.setResult2}" />
<p:ajax event="connect" listener="#{questChart.onConnect}" />
<p:ajax event="disconnect" listener="#{questChart.onDisconnect}" />
<p:ajax event="connectionChange" listener="#{questChart.onConnectionChange}" />
</p:diagram>
</p:panel>
<script type="text/javascript">
function setClickedSpanElement(parentElement) {
var resultx = parentElement.parentNode.innerHTML;
console.log(result)
execAssignment([{resultx:result}]);
execAssignment2([{resultx:result}]);
}
</script>
</ui:composition>
bean:
public void setResult() {
FacesContext context = FacesContext.getCurrentInstance();
Map<String, String> map = context.getExternalContext().getRequestParameterMap();
log.info("done... : " + map.get("resultx"));
}
public void setResult2(String resultx) {
log.info("done...2 : " + resultx);
}
LOG:
01:32:47.986 [http-nio-8080-exec-3] INFO com.wolfo.beans.QuestChart - done... : null
01:32:48.047 [http-nio-8080-exec-6] INFO com.wolfo.beans.QuestChart - done...2 : javax.faces.event.ActionEvent[source=org.primefaces.component.remotecommand.RemoteCommand@3b30fbb2]
浏览器控制台:
<span id="quest-editor-form:questName" style="display:block; margin-top:1em;">Quest Element 0</span><a id="quest-editor-form:j_idt13" href="#" class="ui-commandlink ui-widget" onclick="setClickedSpanElement(this);PrimeFaces.ab({s:"quest-editor-form:j_idt13"});return false;"><img id="quest-editor-form:j_idt14" src="/javax.faces.resource/woodenui/gear.png.xhtml" alt="" width="20" height="20"></a>
好。这不是很明显,但是我已经设法解决了。代替使用pe:remoteCommand action =“” ....更改为actionListener =“”提供了解决方案。
<pe:remoteCommand name="execAssignment" actionListener="#{questChart.setResult2}">
<pe:methodSignature parameters="java.lang.String" />
<pe:methodParam name="resultx" />
</pe:remoteCommand>
工作。
完整答案:带面板的xhtml部分:
<p:panel header="Quest Panel" id="questEditPanel">
<p:diagram id="diagram" value="#{questChart.model}" style="height:1200px" styleClass="ui-widget-content" var="el">
<f:facet name="element">
<h:outputText id="questName" value="#{el.questName}" style="display:block; margin-top:1em;"/>
<p:commandLink onclick="setClickedSpanElement(this)" >
<p:graphicImage name="woodenui/gear.png" width="20" height="20"/>
</p:commandLink>
</f:facet>
<pe:remoteCommand name="execAssignment" actionListener="#{questChart.setResult2}">
<pe:methodSignature parameters="java.lang.String" />
<pe:methodParam name="resultx" />
</pe:remoteCommand>
<p:ajax event="connect" listener="#{questChart.onConnect}" />
<p:ajax event="disconnect" listener="#{questChart.onDisconnect}" />
<p:ajax event="connectionChange" listener="#{questChart.onConnectionChange}" />
</p:diagram>
</p:panel>
<script type="text/javascript">
function setClickedSpanElement(parentElement) {
var resultx = parentElement.parentNode.innerHTML;
console.log(resultx)
execAssignment(resultx);
}
</script>
bean:
public void setResult2(String resultx) {
log.info("done...2 : " + resultx);
}