jjzjj

关于条件渲染元素内的 jsf:ajax 侦听器不起作用

codeneng 2023-03-28 原文

ajax listener inside conditionally rendered element not working

本问题已经有最佳答案,请猛点这里访问。

这是我的问题的测试用例:

测试豆:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@ManagedBean
@ViewScoped
public class TestBean implements Serializable {
    private static final long serialVersionUID = -2329929006490721388L;

    private List<TestObject> testObjects;
    private int selectedId;

    public TestBean(){
        List<TestObject> to = new ArrayList<TestObject>();
        for(int i=0; i<10; i++){
            TestObject o = new TestObject(i,"object-"+i);
            to.add(o);
        }
        this.setTestObjects(to);
    }

    public void testAjaxListener(int id){
        System.out.println("testAjaxListener("+id+")");
        this.setSelectedId(id);
    }

    //+getters/setters
}

测试对象

1
2
3
4
5
6
7
8
9
10
11
public class TestObject {
    private int id;
    private String name;

    public TestObject(int id, String name){
        this.setId(id);
        this.setName(name);
    }

    //+getters/setters
}

测试.xhtml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head></h:head>
<h:body>
    <h:form id="testForm">
        <h:panelGroup rendered="#{param['view'] eq 'test'}">
            DataTable
            <h:dataTable var="o" value="#{testBean.testObjects}">
                <h:column>
                    <h:commandLink value="#{o.name}" actionListener="#{testBean.testAjaxListener(o.id)}">
                        <f:ajax
                            render=":testForm:outputTest"
                        />
                    </h:commandLink>
                </h:column>
            </h:dataTable>
            output
            <h:outputText id="outputTest" value="#{testBean.selectedId}" />
        </h:panelGroup>
    </h:form>
</h:body>
</html>

问题是,actionListener 不会触发(我正在使用 System.out.print 进行检查,如您所见)。当我从 panelGroup 中删除条件渲染时它工作正常,所以我认为这是问题所在 - 但我该如何解决?
我已经阅读了这些主题:
h:commandLink / h:commandButton 未被调用,
f:ajax 在有条件呈现的自定义标记内 - 未调用支持 bean 方法
还有更多,但它并没有解决我的问题:(

请帮忙


这是因为 #{param['view'] eq 'test'} 在 JSF 忙于处理 ajax 提交时没有评估 true。然后它还会再次查询 rendereddisabledreadonly 属性,以防止被黑客入侵的请求。 JSF 即不包括 <h:form> 生成的 <form action> URL 中的请求参数。这与未调用或未更新输入值的 commandButton/commandLink/ajax 操作/侦听器方法的第 5 点相匹配。

有几种方法可以解决这个问题。

  • 通过 <f:viewParam>.

    将其设置为视图范围 bean 的属性

    1
    2
    3
    4
    5
    <f:metadata>
        <f:viewParam name="view" value="#{testBean.view}" />
    </f:metadata>
    ...
    <h:panelGroup rendered="#{testBean.view eq 'test'}">

  • 通过<f:param>手动保留参数(你需要把它放在每个提交动作中!):

    1
    2
    3
    4
    <h:commandLink ...>
        <f:param name="view" value="#{param.view}" />
        ...
    </h:commandLink>
  • <h:form> 替换为 OmniFaces <o:form>,它能够告诉 JSF 它必须将表单提交到包含请求参数的 URL:

    1
    2
    3
    <o:form includeRequestParams="true">
        ...
    </o:form>
  • 也可以看看:

    • 在 JSF 表单提交上保留 GET 请求查询字符串参数

    • 感谢帮助! :D 第 2 点解决了我的问题。不幸的是,第 1 点和第 3 点由于某种原因不起作用:/
    • 我错了。 OmniFaces 表格也有帮助;-)

    有关关于条件渲染元素内的 jsf:ajax 侦听器不起作用的更多相关文章

    1. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

      如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

    2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

      我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

    3. ruby - 在 Ruby 中有条件地定义函数 - 2

      我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

    4. ruby - 定义方法参数的条件 - 2

      我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

    5. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

      rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

    6. ruby - 在哈希的键数组中追加元素 - 2

      查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

    7. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

      按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

    8. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

      本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

    9. ruby - Hanami link_to 助手只呈现最后一个元素 - 2

      我是HanamiWorld的新人。我已经写了这段代码:moduleWeb::Views::HomeclassIndexincludeWeb::ViewincludeHanami::Helpers::HtmlHelperdeftitlehtml.headerdoh1'Testsearchengine',id:'title'hrdiv(id:'test')dolink_to('Home',"/",class:'mnu_orizontal')link_to('About',"/",class:'mnu_orizontal')endendendendend我在模板上调用了title方法。htm

    10. ruby-on-rails - 使用包含多个关联和单独的条件 - 2

      我的Gallery模型中有以下查询:media_items.includes(:photo,:video).rank(:position_in_gallery)我的图库模型有_许多媒体项,每个都有一个照片或视频关联。到目前为止,一切正常。它返回所有media_items包括它们的photo或video关联,由media_item的position_in_gallery属性排序。但是我现在需要将此查询返回的照片限制为仅具有is_processing属性的照片,即nil。是否可以进行相同的查询,但条件是返回的照片等同于:.where(photo:'photo.is_processingIS

    随机推荐