Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF按钮动作触发两次_Jsf_Primefaces_Wildfly - Fatal编程技术网

JSF按钮动作触发两次

JSF按钮动作触发两次,jsf,primefaces,wildfly,Jsf,Primefaces,Wildfly,我已经在WildFly论坛上问过这个问题,但到目前为止还没有得到任何答案。所以我在这里尝试 自从我从WildFly 8.1升级到8.2后,我在连接到bean的选项卡视图中遇到了commandButton问题 下面是一个简单的JSF页面: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="htt

我已经在WildFly论坛上问过这个问题,但到目前为止还没有得到任何答案。所以我在这里尝试

自从我从WildFly 8.1升级到8.2后,我在连接到bean的选项卡视图中遇到了commandButton问题

下面是一个简单的JSF页面:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head></h:head>
    <h:body>
        <h:form>
            <p:tabView binding="#{testBean.tabView}">
                <p:tab title="Tab">
                    <p:commandButton value="Inside" action="#{testBean.testInside}"/>
                </p:tab>
            </p:tabView>
            <p:commandButton value="Outside" action="#{testBean.testOutside}"/>
        </h:form>
    </h:body>
</html>
单击“内部”按钮将触发两次testInside()。“外部”按钮(选项卡视图外部)的行为正常,并且只触发一次它的方法。删除tabView绑定可以消除这个问题。我正在使用PrimeFaces4.0

谢谢你的建议

Jan

这是一个,由2.2.7中的性能优化补丁引入

这是一个Mojarra“问题”,我在处理RF-13920时发现了它,它是由JAVASERVERFACES-3193引入的。使用绑定的组件不会在向服务器发出请求的过程中重新创建,但会创建它们的子组件。在原始子项仍然存在的情况下,插入新子项会导致“重复id”错误

因此,看起来按钮添加了两次,但由于没有指定显式id,因此不会出现重复id错误。。。尝试一下(添加显式id)可能会很有趣

JSF规范规定绑定只应在请求范围内使用,因此我认为如果在会话范围内绑定失败,不应将其视为bug

最后一句话很有趣。正如jboss网站的下一篇文章所述:

但是现在我认为我已经有了一个令人满意的解决方案,并且我可以确认,对于绑定组件的请求范围的支持bean,异常和重复id问题不再发生,即使使用Wildfly-8.2.0.Final中的Mojarra 2.2.8也是如此

如果页面的其余逻辑仍保留在(比如)会话范围的bean中,这一点也是正确的。您只需要为binding属性提供一个请求范围的bean,然后可以在EL和其他bean中引用它


还可以选择

您可以尝试以其他方式进行操作。在选项卡外使用remoteCommand,操作与commandButton相同
然后在commandButton的onclick事件中使用remoteCommand创建的JavaScript函数
下面是使用您的代码的示例。
它很实用

<h:form>
    <p:remoteCommand id="myfun" name="myfun" action="#{testBean.testInside}" />
    <p:tabView binding="#{testBean.tabView}">
        <p:tab title="Tab">
            <p:commandButton value="Inside" onclick="myfun();"/>
        </p:tab>
    </p:tabView>
</h:form>


为什么需要绑定(
binding=“#{testBean.tabView}”
)呢?在实际的应用程序中需要绑定,因为选项卡是动态生成的。你能用更新的PF版本尝试一下这个最小的应用程序并检查它是否仍然存在吗?@BalusC你说“组件是请求范围的,但是您要将其绑定到会话范围的bean”,这是否意味着我们应该始终使用与请求范围的bean的绑定?我想我在这里找到了一些答案,这可能也有助于OP(BalusC answer中的附加链接也非常有用):您是对的,分配id会导致重复id错误。我将尝试按照BalusC的建议处理请求范围或放弃绑定。使用mojarra 2.2.6修复了我的问题。很遗憾,我无法重构代码,降级似乎在某种程度上起作用,尽管我在绑定ViewScopeB的backbean时遇到了问题广告选择…咬苹果,重构…永远是内特的选择。特别是现在你遇到了不同的问题@ameenyou是对的-但这是一个很大的问题,任务是有时间限制的,而且已经违反了确定的,但是如果你有6个标签,6个不同的按钮,你需要6个远程命令。在这种情况下使用commandButton也是“错误的”,哟您应该将commandButton与
type=“button”
一起使用……此解决方案引入了比“正确”操作所需的更大的复杂性
<h:form>
    <p:remoteCommand id="myfun" name="myfun" action="#{testBean.testInside}" />
    <p:tabView binding="#{testBean.tabView}">
        <p:tab title="Tab">
            <p:commandButton value="Inside" onclick="myfun();"/>
        </p:tab>
    </p:tabView>
</h:form>