Friday, July 22, 2016

JSF, AJAX: 在遞交ajax到後台處理, 再返回參數到javascript

在新增一個ajax的event後想要在後台處理一些邏輯,但是後台的變量並沒有在ajax完全執行後才回傳,導致無法馬上彈出提示信息。

問題︰我想要做的是下拉式選單的項目選擇後,到後台執行selectResult,其中會改變一個變量叫isSameResult,在oncomplete時把參量放到checkSameService的javascript函數中再做處理。

//-----**index.jsf**-----
<p:autoComplete ...>
 <p:ajax event="itemSelect" listener="#{bean.selectResult}" update="..." oncomplete="checkSameService(#{bean.isSameResult});"/>
</p:autoComplete>

<script>
function checkSameService(result) {
 alert(result);
}
</script>

//-----**Bean.java**-----
public void selectSerResult(SelectEvent event) {
 isSameResult = true;
}

雖然selectResult是處理完,變量也更新了(isSameResult由false變為true),但傳到javascript時卻未更新(仍然是false)。

解決方案︰上網找了一陣子發現可以從後台把參數放入javascript︰

//-----**index.jsf**-----
<p:autoComplete ...>
 <p:ajax event="itemSelect" listener="#{bean.selectResult}" update="..." oncomplete="checkSameService(xhr, status, args);"/>
</p:autoComplete>

<script>
function checkSameService(xhr, status, args) {
 alert(args.isSame);
}
</script>

//-----**Bean.java**-----
public void selectSerResult(SelectEvent event) {
 isSameResult = true;
 RequestContext context = RequestContext.getCurrentInstance();
        context.addCallbackParam("isSame", isSameResult );
}

然後就可以成功在完成處理後把結果寄回到javascript了。

No comments: