2015-04-23 44 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 –

相关问题