2014-02-21 67 views
0

我試圖在我的應用程序中實現primefaces的RemoteCommand標記,但不知怎的,它不像文檔所說的那樣工作。JSF&Primefaces - RemoteCommand工作不正常

我想要實現的是:我有幾個頁面佈局不同,但都使用相同的JSF模板。 (基本上模板的內容發生變化)。不同的頁面應該一個接一個地自動加載,並且彼此間隔一段時間。

<p:remoteCommand name="remoteSwitchPage" actionListener="#{circuitBean.redirect()}" autoRun="false"/> 

這是我的JSF代碼,這should一個名爲remoteSwitchPage() JavaScript方法提供了我,但它不!它也應該not運行,因爲我已經說過autoRun="false",但是它運行在加載的時候調用方法remoteSwitchPage()後,它應該通過Java渲染另一個頁面(這實際上是工作的,不知何故,當離開括號時,JSF不會找到重定向方法,這就是爲什麼我放了它們)。

所以總結:

  1. JavaScript不與remoteSwitchPage()
  2. 的remoteCommand在頁面加載,它should not!
  3. JSF將不會離開的時候找到我ManagedBean方法resize(),運行提供了我括號

你們有什麼線索我在做什麼錯在這裏?

我使用primefaces 4.0JSF 2.1

回答

1

在Simegos'發表的評論說,解決

管理它。

我創建了一個隱藏按鈕,每隔X秒用JavaScript點擊一次。點擊按鈕後呈現的每個頁面都需要實現以下代碼。將代碼放在所有渲染頁面將實現的模板中是理想的。

<h:form id="form" class="hidden"> --> Hidden button 
    <h:commandButton id="switchPageButton" action="#{circuitBean.renderNextScreen()}"/> 
</h:form>  
<h:outputScript> 
    $(function() { 
     $(".hidden").each(function() { --> Declare Form as hidden, since it becomes overwritten by JSF 
      $(this).css("display","none"); 
     }); 
     var switchPageLink = $("#form\\:switchPageButton"); --> Get Button via ID 
     window.setInterval(function() { 
      switchPageLink.click(); --> Click it 
     }, #{circuitBean.pageInterval}); --> after X seconds. I'm reading the interval through the bean here. You can just put a number in there 
    }); 
</h:outputScript> 
+1

我很高興聽到你修好它:)好的工作,你也可以標記你的答案爲正確的或我的,如果你想,不要讓這個問題作爲未答覆 – Simego

+1

將做它明天;) – JustBasti

3

如果你使用:

<p:remoteCommand name="remoteSwitchPage" actionListener="#{circuitBean.redirect}" /> 

JSF將嘗試找到getRedirect,這就是爲什麼你應該使用circuitBean.redirect()

編輯:我認爲你應該使用action而不是actionListener

這是我的示例代碼(測試):

HTML:

<a href="#" onclick="logoutAccount()"><i class="fa fa-sign-out fa-fw"></i> Logout</a> 

HTML(頁面的端)的另一部分:

<h:form prependId="false"> 
    <p:remoteCommand action="#{sessionMB.logout()}" name="logoutAccount" /> 
</h:form> 

豆:

public void logout() { 
    account = null; 
    logged = false; 
    FacesUtil.addInfoGrowl(MessageProvider.getMessage("message.logout.success"), null); 
    FacesUtil.redirectToPage("", true); 
} 

redirectToPage方法:

public static boolean redirectToPage(String completePath, Boolean keepMessages) { 
    try { 
     FacesContext.getCurrentInstance().getExternalContext().getFlash().setKeepMessages(keepMessages); 
     FacesContext.getCurrentInstance().getExternalContext().redirect(SimegoUtil.redirectProject() + completePath); 

     return true; 
    } catch (IOException ex) { 
     FacesUtil.addErrorGrowl(MessageProvider.getMessage("message.redirectFail"), null); 
     return false; 
    } 
} 

那麼,會是這樣:
點擊>通話remoteCommand的Javascript >調用Bean >重定向到另一頁

我只是沒有得到你說的模板部分,如果我能幫助更多的東西告訴我,希望你修復它。

+0

感謝您的範例代碼。是否可以在X秒後以編程方式調用'logoutAccount()',而不需要用戶點擊它? **編輯:**請參閱,這就是爲什麼我想要在普通JavaScript中使用該方法() – JustBasti

+0

我能想到的唯一解決方案是創建一個不可見的按鈕,該按鈕將通過一些JavaScript – JustBasti

+0

setTimeout()在文檔加載 – VeenarM