jsf function未定義 - 從託管bean調用JavaScript函數





如何使用function function函數 (5)


你不能簡單。

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

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

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

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




在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');");
}

也可以看看:




通常,Java提供了一個API來使用腳本引擎來評估字符串。 這可以通過javax.script.ScriptEngine和javax.script.ScriptEngineManager類來完成。

我不完全確定你的情況,但是如果你可以將javascript作為字符串傳遞給託管bean,你可以使用Java腳本API在服務器端運行javascript。

有關更多信息,請訪問以下鏈接: http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.htmlhttp://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html




根據您所使用的Primefaces版本,您可以使用RequestContext.execute("{js here}");

從Primefaces 3.4文檔:

RequestContext提供了一種在ajax請求完成時執行javascript的方法,與傳遞回調參數和執行條件javascript相比,這種方法更容易。 下面的示例在ajax請求完成時隱藏對話框;

public void save() {
  RequestContext requestContext = RequestContext.getCurrentInstance();  
  requestContext.execute("dialog.hide()");
}



更好地解釋格雷格的答案

functionTwo();
function functionTwo() {
}

為什麼沒有錯誤? 我們總是被告知表達式是從上到下執行的(??)

因為:

函數聲明和變量聲明總是被JavaScript解釋器無形地移動( hoisted )到其包含範圍的頂部。 顯然,功能參數和語言定義的名稱已經存在。 本櫻桃

這意味著代碼如下:

functionOne();                  ---------------      var functionOne;
                                | is actually |      functionOne();
var functionOne = function(){   | interpreted |-->
};                              |    like     |      functionOne = function(){
                                ---------------      };

請注意,聲明的賦值部分未被提升。 只有名字被懸掛。

但在函數聲明的情況下,整個函數體也將被提升

functionTwo();              ---------------      function functionTwo() {
                            | is actually |      };
function functionTwo() {    | interpreted |-->
}                           |    like     |      functionTwo();
                            ---------------




javascript jsf primefaces managed-bean