gpt4 book ai didi

ajax - 如何动态地向我的面板添加 ajax 关闭监听器?

转载 作者:行者123 更新时间:2023-12-04 04:43:43 24 4
gpt4 key购买 nike

我动态创建我的面板,我也想动态添加 ajax 关闭监听器,但对我不起作用。对于每个面板:

    int u = _memosId.get(i);
Panel panel = (Panel)_application.createComponent(_context, "org.primefaces.component.Panel", "org.primefaces.component.PanelRenderer");

panel.setId("mymemo_" + String.valueOf(u));
panel.setHeader(_userNames.get(i));
panel.setClosable(true);
panel.setToggleable(true);


HtmlOutputText memo = new HtmlOutputText();
memo.setValue(_userMemos.get(i));
panel.getChildren().add(memo);


AjaxBehavior ajaxBehavior =(AjaxBehavior)_context.getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);
ajaxBehavior.addAjaxBehaviorListener(new ClosePanelListener());
ajaxBehavior.setTransient(true);
panel.addClientBehavior("close", ajaxBehavior);

_column1.addWidget(panel.getId());
getDashboard().getChildren().add(panel);

和我的类(class)听众:
    private static class ClosePanelListener implements AjaxBehaviorListener 
{

@Override
public void processAjaxBehavior(AjaxBehaviorEvent event) throws AbortProcessingException
{
System.out.println("----------->>>>>>>>>>AjaxListener CALLED!!! ");
}
}

不调用监听器。

最佳答案

您的具体问题是由于以下行引起的,

AjaxBehavior ajaxBehavior =(AjaxBehavior)_context.getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);

本质上创建了一个 <f:ajax> , 而这个 <p:panel>只有 <p:ajax> 才真正支持 close listener .您也可以在生成的 HTML 输出中看到它; Mojarra.ab() (或任何 MyFaces 特定功能,以防您使用 MyFaces 而不是 Mojarra)被用来代替 PrimeFaces.ab() .

为了正确创建 <p:ajax> ,需要使用PrimeFaces自己的 AjaxBehavior相反,让你的听众从 PrimeFaces 扩展自己的 AjaxBehaviorListenerImpl :
import org.primefaces.component.behavior.ajax.AjaxBehavior;
import org.primefaces.component.behavior.ajax.AjaxBehaviorListenerImpl;

AjaxBehavior ajaxBehavior = new AjaxBehavior();

public static class ClosePanelListener extends AjaxBehaviorListenerImpl

(请注意,我将嵌套类从 private 更改为 public ,否则您最终可能会遇到一些 EL 实现的可见性问题)

无关 针对具体问题,变量命名约定 _application_context建议将它们作为支持 bean 类的实例变量。对于设计和线程安全来说,这是一个非常糟糕的主意。它们应该在方法局部范围内获得,并且永远不要作为实例变量分配。

此外,您是否考虑过 <ui:repeat><c:forEach>为了在循环中动态创建面板?这将最终得到比这个困惑更清晰和声明性的代码。

关于ajax - 如何动态地向我的面板添加 ajax 关闭监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18513414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com