【问题标题】:How do I add ajax behavior to a dynamically created component in a backing bean?如何将 ajax 行为添加到支持 bean 中动态创建的组件?
【发布时间】:2011-12-03 00:51:59
【问题描述】:

针对 Infragile 在另一个线程中的请求,我将此作为一个单独的问题而不是后续问题提出。

这是我试图解决的问题: 我正在从 JSF1.2 迁移到 JSF2。在 JSF1.2 中一切正常。 我已经将一个关键项目重写为一个复合组件,它基本上是通过在代码中添加组件在我的支持 bean 中创建的一个面板。

特别是,我在代码中创建了 h:inputText 和 h:selectOneMenu 组件以及“应用”h:commandButton。 “应用”按钮有一个动作侦听器,用于检查 h:inputText 和 h:selectOneMenu 组件中的值。所有这些工作正常,但是当我获取 h:inputText 或 h:selectOneMenu 组件中的值时,我得到的是原始值,而不是用户输入的新值。就像我说的,这在 JSF1.2 中运行良好(我得到了新值),但由于某种原因在 JSF2 中不行。

我已经尝试了几种方法来解决这个问题,但没有奏效,所以我想我会在 h:inputText 和 h:selectOneMenu 项中添加 ajax 行为,当这些组件中的值发生变化时,我可以调用另一个支持用于获取新值的 ajax 行为的 bean 侦听器。

我正在尝试将 ajax 行为添加到我在代码中创建的组件(未绑定到页面组件)。我可以毫无问题地创建组件。但是,我遇到的问题是如何将 ajax 行为添加到组件中。

有人可以发布示例代码来为值更改或模糊事件添加 ajax 行为吗?这是我用来在代码中创建组件的代码 - 我需要如何修改它以添加 ajax 行为? hpg = 新的 HtmlPanelGrid(); 儿童 = hpg.getChildren(); children.clear(); …… 输入 = 新的 HtmlInputText(); …… children.add(输入);

我必须添加什么代码来替换“在此处添加 ajax 行为”行,以及侦听器方法的争论是什么(替换下面 ????? 的方法的争论)?

public void myAjaxListener(?????) { ...... {

一段时间以来,我一直在努力解决这个问题。我觉得我很接近,但不知道我需要的语法。如果有帮助,我可以提供有关如何获取组件 ID 和在操作侦听器中搜索值的更多信息。

谢谢

【问题讨论】:

    标签: ajax jsf-2


    【解决方案1】:

    这是你可以动态添加 AjaxBehaviorListener 到你的组件的方法:

    ...
    HtmlInputText inpuText = new HtmlInputText();
    AjaxBehavior blurBehavior = new AjaxBehavior();
    blurBehavior.addAjaxBehaviorListener(new BlurListener());
    blurBehavior.setTransient(true);
    inputText.addClientBehavior("blur", blurBehavior)
    ...
    
    public class BlurListener implements AjaxBehaviorListener {
    
        public BlurListener() {
        }
    
        @Override
        public void processAjaxBehavior(AjaxBehaviorEvent event) {
            // do your job
            HtmlInputText inputText = event.getComponent(); // your input text component
            ...
        }
    }
    

    "blur" 表示触发此侦听器的事件。请记住,JSF 组件必须支持此事件,否则将无法正常工作。
    (这里你可以看到幕后以及如何构建自定义AJAX组件http://weblogs.java.net/blog/driscoll/archive/2009/10/09/jsf-2-custom-java-components-and-ajax-behaviors?force=670

    但是,在您的情况下,我认为问题在于按钮 ActionListener 在提交实际组件值之前被触发。您可以通过将 ActionListener 逻辑移动到按钮操作、通过上述 AJAX 或通过在 UIComponents(HtmlInputText、UISelectOne)中查找实际值来解决它,不确定但即时属性也会影响它。

    【讨论】:

    • 非常感谢您的回复。我想我在我的代码中发现了另一个我无法解释的项目。应用按钮是动态添加的,我添加了带有以下内容的动作侦听器:'
    • 无法弄清楚如何添加代码段 - 如果可以的话,我会用另一个问题来回答我的问题。
    • 显然不是。我在 8 小时内不能回答我自己的问题。我遇到的问题是,如果我动态添加它,我的 Apply 按钮的动作侦听器似乎不会被调用。我会做更多的调查然后回来。再次感谢您的反馈。
    • 当您动态添加组件时,最好为 tham 设置一些唯一 ID。特别是对于动态组件。我也将 tham 通常设置为瞬态。当您动态添加组件时,为 tham 设置一些唯一 ID 是一种很好的做法。特别是对于动态组件。我也将 tham 通常设置为瞬态。 HtmlInputText inpuText = new HtmlInputText(); inputText.setId("uniqueString"); inputText.setTransient(true);如果你喜欢我的回答,你可以给我一些分数:)。
    • 链接不存在,我在这里找到了备用链接jamesgdriscoll.wordpress.com/2010/02/09/…
    猜你喜欢
    • 2011-03-24
    • 2012-11-15
    • 1970-01-01
    • 2018-10-22
    • 2021-06-13
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多