【问题标题】:Get updated value from bean through JavaScript in JSF通过JSF中的JavaScript从bean获取更新值
【发布时间】:2015-07-01 00:44:02
【问题描述】:

我在 itemComp.xhtml 中有一个上下文菜单,如果我单击上下文菜单中的任何项目,将调用 itemDisplay.refreshItems 并在完成此操作时调用 JavaScript 函数 showPanel()

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() 中,我将所有变量设置为 true。

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 值,因此可用的包(if( #{itemDisplay.availableBags} ))false(即使它在支持 bean 中设置为 true)和面板未显示。如果我刷新页面,那么我将从支持 bean 获取更新的值(if( #{itemDisplay.availableBags} ) 为 true 并显示面板。任何人都可以帮助我为什么我只能通过刷新页面来获取更新的值。

【问题讨论】:

  • 我想不通,请您详细说明一下
  • 除非您再次渲染 rich:menuItem,否则不会使用新值评估 EL 表达式(那种 #{} 事物)。这就是您没有更新它们的原因。
  • 我在 a4j:Panel 中添加了一个 id,其中嵌入了这个 rich:menuItem 并尝试重新渲染它
  • .......... ... rerender="testPanel" ..........
  • 但出现以下错误“已为元素“a4j:outputPanel”指定属性“id”。

标签: javascript jsf richfaces


【解决方案1】:

正如所指出的,EL 表达式在页面呈现并成为静态文本时进行评估。

您可以使用@data,例如:

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

event.data 将包含属性的当前值(您甚至可以将其指向一个对象)。

编辑:在 RichFaces 3.x 中,JS 参数只是 data

【讨论】:

  • event.data 在 showPanel javascriptfunction 中未定义,我用 alert 打印了它
  • event.data 应该始终存在。您使用的是哪个版本的 RichFaces?
  • 下次最好提一下,否则我希望您使用最新的。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多