0
<h:form>
            <h:selectOneMenu value="#{productBean.productName}">
                <f:selectItem itemValue="" itemLabel="..." />
                <f:selectItems value="#{productBean.pizza}" var="pizza" itemValue="#{pizza.name}" itemLabel="#{pizza.name}" />
                <f:ajax listener="#{productBean.valueChanged(productBean.productName)}" render="pizzaResult pizzaButton" />
            </h:selectOneMenu>
            <h:commandButton value ="Dodaj do zamówienia" disabled="#{productBean.isDisabled}"  id="pizzaButton" onclick="#{productBean.order}"/>
            <h:outputText id="pizzaResult" value="#{productBean.message}" />
        </h:form>

这是我的 JSF 表格。在某些情况下,我使用 valueChanged 侦听器使按钮无效,并且效果很好。但我不明白为什么它也会触发按钮 onclick。如何做一些使我只能在单击后才能使用按钮的事情?

我注意到当我删除禁用的选项时效果很好:/但是为什么当按钮启用时我无法触发操作?

4

2 回答 2

0

好的,我做到了。问题是该按钮可能显示为已启用(disabled="false"),但其客户端更改并且服务器不知道它并且应用程序认为该按钮仍处于禁用状态。即使它看起来像已启用的按钮,它也无法使用action="#{something}"。您必须让服务器知道更改。我唯一做的就是将 bean 添加@ViewScoped到托管 bean。现在服务器也可以看到禁用和启用按钮的操作并且可以正常工作。

但是我有一个问题。客户端验证是个坏主意。禁用按钮是唯一阻止用户发送不可用的空 itemValue 或产品(在我的情况下)(is_available = 0在 DB 中)。问题是:是否足以确保它是安全的?

编辑:不幸的是,在单击按钮后,即使 oneSelectMenu 变为第一个空值,按钮也会显示为启用状态。更改列表后,它再次像以前一样工作,再次单击后,情况再次需要时间。

于 2013-05-13T08:26:16.590 回答
0

onclick是客户端属性,因此您不应该尝试将其绑定到托管 bean 方法调用,并且看起来好像您做了onclick=#{productBean.order}(除了缺少的引号)。这可能是您的问题的原因。

于 2013-05-12T15:29:44.160 回答