使用@ManagedBean中的值执行JS函数

时间:2017-08-16 13:43:52

标签: jsf jsf-2.2

我有一个后端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)}') />

1 个答案:

答案 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变量的更新值,我们执行以下操作:

  • 调用actionListener来更新bean上的变量值;
  • 在第二个链接上进行ajax更新以从bean获取更新的值;
  • 调用oncomplete方法并单击第二个链接(现在使用正确的值更新);

第二:要调用第二个链接上的点击,我们必须在jQuery调用中转义两个点。

第三:使用display:none样式设置第二个Link,使其在屏幕上不可见。

现在只是对它的一些想法:JSF与JavaScript一起工作得很好,但有时候我们必须做出像这样的一些笨拙的技巧来实现一个简单的&#34;简单的&#34;任务。我并不是说JSF不好,但我认为我们可以有一个更开箱即用的&#39;处理这类事情。只是我的意见。