2015-04-23 42 views
0

我在itemComp.xhtml中有一個上下文菜單,如果我點擊上下文菜單中的任何項目,將調用動作itemDisplay.refreshItems並完成此操作JavaScript函數showPanel()將被稱爲通過JSF中的JavaScript從bean獲取更新值

itemComp.xhtml

<rich:contextMenu disableDefaultMenu="true" event="oncontextmenu" submitMode="ajax"> 
    <rich:menuItem disabled="true" style="color:black; font-weight:bold;" value="Items"/> 
    <rich:menuSeparator/> 

    <c:forEach items="#{itemDisplay.componentTypeMap.keySet}" var="itemValue"> 
     <rich:menuItem value="#{itemValue}" 
         rendered="#{(itemValue == 'Bags Report') or 
            (itemValue == 'Chairs Report') or 
            (itemValue == 'Tables Report')}" 
         action="#{itemDisplay.refreshItems}" 
         oncomplete="showPanel('#{itemValue}','#{item.id}')"> 
     </rich:menuItem> 
    </c:forEach> 
</rich:contextMenu> 

在itemDisplayBean.java的refreshItems(),我設置的所有變量爲真。

itemDisplayBean.java

私人布爾availableBags = FALSE;

public boolean getAvailableBags() { 
    return this.availableBags; 
} 

public void setAvailableBags(boolean availableBags) { 
    this.availableBags = availableBags; 
} 
private boolean availableBags = false; 

public boolean getAvailableBags() { 
    return this.availableBags; 
} 

public void setAvailableBags(boolean availableBags) { 
    this.availableBags = availableBags; 
} 
private boolean availableChairs = false; 

public boolean getAvailableChairs() { 
    return this.availableChairs; 
} 

public void setAvailableChairs(boolean availableChairs) { 
    this.availableChairs = availableChairs; 
} 
private boolean availableTables = false; 

public boolean getAvailableTables() { 
    return this.availableTables; 
} 

public void setAvailableTables(boolean availableTables) { 
    this.availableTables = availableTables; 
} 

public String refreshItems() { 
    setAvailableBags(true); 
    setAvailableChairs(true); 
    setAvailableTables(true); 
} 

和itemDisplay.xhtml,我有JavaScript函數showPanel()如下。

function showPanel(item, itemId) { 

    if (item == 'Bags Report') { 
     if (#{itemDisplay.availableBags}) 
      Richfaces.showModalPanel('bags'); 
     else 
      alert('No bags Found'); 
    } else if (item == 'Chairs Report') { 
     if (#{itemDisplay.availableChairs}) 
      Richfaces.showModalPanel('chairs'); 
     else 
      alert('No Chairs Found'); 
    } else if (item == 'Tables Report') { 
     if (#{itemDisplay.availableTables}) 
      Richfaces.showModalPanel('tables'); 
     else 
      alert('No Tables Found'); 
    } 
} 

和這裏的問題是 - 在JavaScript函數,我沒有得到更新後臺bean的值,因此availableBags(if(#{itemDisplay.availableBags}))false(即使它被設置爲true,支持豆),面板如果我刷新頁面,那麼我會從後臺bean(if(#{itemDisplay.availableBags}))獲得更新後的值,並顯示面板。任何人都可以幫助我爲什麼只通過刷新頁面來獲取更新的值。

+0

我無法弄清楚,你可以請詳細說明它 –

+0

的EL表達式(那種'#{}'的東西)不會除非再次渲染'rich:menuItem',否則用新值進行評估。這就是爲什麼你沒有更新它們。 –

+0

我爲a4j添加了一個id:其中嵌入了rich:menuItem的面板並試圖重新渲染它 –

回答

0

正如所指出的那樣,當頁面呈現併成爲靜態文本時,EL表達式被評估。

您可以使用@data,例如:

<rich:menuItem data="#{itemDisplay.availableBags}" 
    oncomplete="showPanel('#{itemValue}', event.data)" … > 

event.data將包含屬性的當前值(你甚至可以將它指向一個對象)。

編輯:RichFaces的3.x中JS參數只是data

+0

event.data在showPanel中未定義javascriptfunction,我用警報 –

+0

打印出eventdata應該總是存在。您使用的是RichFaces的版本? – Makhiel

+0

richfaces-3.3.0 –

相關問題