2

我尝试将事件侦听器附加到复合组件,如下所示:

<cc:interface>
    <cc:attribute name="listener" method-signature="void listener(javax.faces.event.ComponentSystemEvent)" />
    <cc:attribute name="value" />
</cc:interface>
<cc:implementation>
    <h:inputText value="#{cc.attrs.value}">
       <f:event type="preRenderComponent" listener="#{cc.attrs.listener}" />
    </h:inputText>
</cc:implementation>

使用页面有这个:

 <ofc:testComp value="#{testAction.testInt}" listener="#{testAction.doWhatever}" />

和像这样的支持bean:

public void doWhatever(ComponentSystemEvent event) {
    System.out.println(testInt);
    System.out.println("I was here");
}

这会导致 PropertyNotFoundException: doWhatevercannot be found on testActionWhen search the web I found this very similar solution。这里的主要区别是省略了 event 参数。当我在我的场景中做同样的事情时,它会起作用(我觉得这很令人困惑,因为f:ajaxf:event的文档声明监听器必须分别遵守void listener(AjaxBehaviorEvent)void listener(ComponentSystemEvent)

问题是:我正在尝试做所有这一切,因为我需要通过返回到事件的原始发送者event#getComponent所以问题是:有没有办法在这种设置中传递事件参数?

背景:我需要对一系列字段进行一些额外的验证。基本上,我想在模型更新挂钩生命周期,执行一些计算,如果值不合适,可能会在调用应用程序阶段之前中止。违规字段需要标记。

我玩了一段时间的正常验证机制,但计算使用的是模型值,那时还没有更新。我知道,即使我让上面的代码运行,preRenderView停止操作也为时已晚,但我正在考虑保留一个隐藏的输入,它目前在后台完成验证失败的工作,只是将侦听器添加到实际上标记了真正的违规领域。但为此,我需要这个活动......有什么想法吗?

提前致谢。

更新:这里的答案使用相同的原理,但在添加参数后也会遇到问题 - 只有我得到不同的错误。

4

0 回答 0