2017-08-16 55 views
1

我有一個後端restservice通話值,返回值,與我有執行JS功能(爲簡單起見,我把「警戒」在這裏,在前端。這必須是在JSF實現的,我有一個困難時期。執行JS功能與@ManagedBean

而且,這是捕獲,性能方面的原因,我想後端其餘-致電第一要上點擊執行。

這裏是(以及許多其他事情),我曾嘗試過:

<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

完成這件事有點棘手,但仍然可行。

有一件事你必須記住第一:你在寫.xhtml的JavaScript代碼在一個「靜」的方式呈現。但是,什麼意思是「靜態」?這意味着如果您在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,而不是隻有一個,爲什麼?因爲在第一個鏈接的不完全調用時,bean變量已經是最新的,但是你的html代碼不是。因此,爲了獲得bean變量的更新值,我們執行以下操作:

  • 調用actionListener更新bean上的變量值;
  • 在第二個鏈接上創建ajax更新以從bean獲取更新的值;
  • 調用oncomplete方法並調用點擊第二個鏈接(現在更新爲正確的值);

第二:要調用第二個鏈接的點擊,我們必須跳過jQuery調用中的兩個點。

三:第二個環節設置與顯示:無風格,使其在屏幕上不可見。

現在只是關於它的一些想法:JSF效果很好旁邊的JavaScript,但是有時候我們必須做出一些拙劣的手法像這樣完成的「易」的任務。我並不是說JSF是不好的,但我認爲我們可以對這些事情采取更「開箱即用」的方法。只是我的意見。

+0

真棒的想法/模式!我認爲,在「firstLink」中的oncomplete事件中,你想觸發$('#form \\:secondLink')。click(),是否正確? – Frischling

+0

真實生活的另一個改進是使用#{component.findComponent('secondLink')。clientId}進行選擇,這樣可以更輕鬆地在實際情況下閱讀代碼,並且在其中堆疊maaaany div等進入彼此。這導致 Frischling

+0

@Frischling是的,第一個鏈接應該調用第二個鏈接點擊,更新我的答案。你也是對的jQuery選擇功能,我省略了它,以儘可能簡單的答案。謝謝你們的高舉,雖然;) – Bonifacio