我尝试将事件侦听器附加到复合组件,如下所示:
<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: doWhatever
cannot be found on testAction
When search the web I found this very similar solution。这里的主要区别是省略了 event 参数。当我在我的场景中做同样的事情时,它会起作用(我觉得这很令人困惑,因为f:ajax和f:event的文档声明监听器必须分别遵守void listener(AjaxBehaviorEvent)
和void listener(ComponentSystemEvent)
)
问题是:我正在尝试做所有这一切,因为我需要通过返回到事件的原始发送者event#getComponent
所以问题是:有没有办法在这种设置中传递事件参数?
背景:我需要对一系列字段进行一些额外的验证。基本上,我想在模型更新后挂钩生命周期,执行一些计算,如果值不合适,可能会在调用应用程序阶段之前中止。违规字段需要标记。
我玩了一段时间的正常验证机制,但计算使用的是模型值,那时还没有更新。我知道,即使我让上面的代码运行,preRenderView
停止操作也为时已晚,但我正在考虑保留一个隐藏的输入,它目前在后台完成验证失败的工作,只是将侦听器添加到实际上标记了真正的违规领域。但为此,我需要这个活动......有什么想法吗?
提前致谢。
更新:这里的答案使用相同的原理,但在添加参数后也会遇到问题 - 只有我得到不同的错误。