我有一个后端restservice调用,返回一个值,我必须执行一个JS函数(为简单起见,我在前端采用了“alert”。这必须在JSF中实现,我是很难过。
而且,这是捕获,出于性能原因,我希望后端rest-callto在点击时执行。
这是(在许多其他事情中),我尝试过:
<p:commandLink action="#{viewingSessionBean.prepareViewingSession(document)}" oncomplete="alert('#{viewingSessionBean.name(document)}')">
<p:graphicImage value="documentViewerPopup.png"/>
</p:commandLink>
这里的豆子(缩短以使点更清楚):
@ManagedBean
@ViewScoped
public class ViewingSessionBean implements Serializable {
private String name;
public String prepareViewingSession(Document document) {
name = restClient.call()
hashMap.put(document.getBlobId(), name);
return null; // don't navigate away...
}
public String name(Document document) {
return hashMap.get(document.getBlobId()); // return null if nothing is cached for the document yet there
}
}
我想做这样的事情(伪代码......没有h:commandScript ......,太旧的JSF,无法升级)
<h:commandScript action="alert('#{viewingSessionBean.prepareViewingSession(document)}') />
答案 0 :(得分:1)
要完成这件事有点棘手,但仍然可行。
首先要记住的一件事:你在.xhtml中编写的JavaScript代码是在一个静态的&#39;中呈现的。办法。但是什么意味着静态&#39;?这意味着如果您在JavaScript代码中引用bean变量,然后在bean中更新此变量值,则您打印的JavaScript代码将无法看到您刚刚进行的这些更改。在这种情况下,您必须首先更新JavaScript代码(使用ajax)以获取变量中的更改,然后才执行它。
让我们从你的bean开始:
@ManagedBean
@ViewScoped
public class ViewingSessionBean implements Serializable {
private String variable;
public String getVariable() {
return this.variable;
}
public void updateVariableValue(Document document) {
variable = restClient.call();
}
}
现在,.xhtml代码:
<h:form id="form">
<p:commandLink id="firstLink"
actionListener="#{viewSessionBean.updateVariableValue(document)}"
update=":form:secondLink"
oncomplete="$('#form\\:secondLink').click()"/>
<p:commandLink id="secondLink" onclick="alert('#{viewSessionBean.variable}')" style="display: none;"/>
</h:form>
请注意以下几点:
首先:它使用了两个commandLinks,而不仅仅是一个,为什么?因为在第一个链接的oncomplete调用时,bean变量已经是最新的,但是你的html代码不是。因此,为了获得bean变量的更新值,我们执行以下操作:
第二:要调用第二个链接上的点击,我们必须在jQuery调用中转义两个点。
第三:使用display:none样式设置第二个Link,使其在屏幕上不可见。
现在只是对它的一些想法:JSF与JavaScript一起工作得很好,但有时候我们必须做出像这样的一些笨拙的技巧来实现一个简单的&#34;简单的&#34;任务。我并不是说JSF不好,但我认为我们可以有一个更开箱即用的&#39;处理这类事情。只是我的意见。