從託管bean調用JavaScript函數


Answers

在PrimeFaces 6.2之前,您可以使用RequestContext#execute()

public void submit() {
    // ...
    RequestContext.getCurrentInstance().execute("alert('peek-a-boo');");
}

在PrimeFaces 6.2及以上版本中:

public void submit() {
    // ...
    PrimeFaces.current().executeScript("alert('peek-a-boo');");
}

在標準JSF中,沒有直接的公共API。 最好的方法是將所需的腳本設置為bean屬性,並在bean屬性不為空時有條件地呈現<h:outputScript>組件。

<h:commandButton ... action="#{bean.submit}" />
<h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
public void submit() {
    // ...
    script = "alert('peek-a-boo');";
}

如果您是通過ajax提交表單,請不要忘記將<h:outputScript>包裝在另一個組件中,而是將其更新為ajax。 另請參見Ajax update / render對具有呈現屬性的組件不起作用

<h:commandButton ... action="#{bean.submit}">
    <f:ajax execute="@form" render="script" />
</h:commandButton>
<h:panelGroup id="script">
    <h:outputScript rendered="#{not empty bean.script}">#{bean.script}</h:outputScript>
</h:panelGroup>

至於“沒有直接的公共API”聲明,奇怪的是PartialResponseWriter類(負責編寫JSF ajax響應)已經有JSF 2.0 startEval()endEval()方法,它們應該使你能夠直接將回調腳本編寫到響應,但直到即將到來的JSF 2.3,令人驚訝的是PartialViewContext沒有公共方法將委託給那些方法。 根據問題1412 PartialViewContext#getEvalScripts()最終被添加到公共API。

public void submit() {
    // ...
    FacesContext.getCurrentInstance().getPartialViewContext().getEvalScripts().add("alert('peek-a-boo');");
}

對於較舊的JSF版本,只能通過創建自定義PartialViewContext實現來實現。 JSF實用程序庫OmniFaces與OmniPartialViewContext完全OmniPartialViewContext ,可以通過Ajax實用程序類使用它

public void submit() {
    // ...
    Ajax.oncomplete("alert('peek-a-boo');");
}

也可以看看:

Question

有沒有辦法從JSF中的託管bean調用(執行)JavaScript函數?

如果那是相關的,我也在使用PrimeFaces。




你不能簡單。

Managed Bean適用於瀏覽器上的服務器和JavaScript。

您可以根據managedbean中設置的值有條件地調用JavaScript




Related