gpt4 book ai didi

jsf - 如何扩展从@FacesComponent 调度的 AjaxBehaviorEvent?

转载 作者:行者123 更新时间:2023-12-04 18:40:37 25 4
gpt4 key购买 nike

当我使用 <cc:clientBehavior name="chartUpdated" event="change" targets="chartdata"/>Composite Component 发送 ajax 事件时 |我使用 <f:ajax event="chartUpdated" listener="#{bean.updateListener}">Facelet 页面 中捕获它.在 backing bean 中,我捕获类型为 AjaxBehaviorEvent 的事件。

public void updateListener(AjaxBehaviorEvent event){
...
}

我明白我可以扩展 AjaxBehaviorEvent 并在其中传递已更改的对象。 For example, Primefaces's Scheduler uses this approach:

  <p:ajax event="eventMove" listener="#{scheduleView.onEventMove}" update="messages" />

和支持bean:

 public void onEventMove(ScheduleEntryMoveEvent event) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Event moved", "Day delta:" + event.getDayDelta() + ", Minute delta:" + event.getMinuteDelta());

addMessage(message);
}

是否可以通过将 Composite Component@FacesComponent 一起使用来实现相同的功能?

提前致谢!

最佳答案

很高兴再次见到你:)

继续您之前的 question :

覆盖 queueEvent() 以过滤有趣的事件(来自特定组件的更改)并将它们的入队推迟到验证阶段,以便能够获取转换和验证的值:

@FacesComponent("rangeComponent")
public class RangeComponent extends UIInput implements NamingContainer
{
private final List<AjaxBehaviorEvent> customEvents = new ArrayList<>();
...

@Override
public void queueEvent(FacesEvent event)
{
FacesContext context = getFacesContext();
if(event instanceof AjaxBehaviorEvent)
{
Map<String, String> params = context.getExternalContext().getRequestParameterMap();
String eventName = params.get("javax.faces.behavior.event");
Object eventSource = event.getSource();

if("change".equals(eventName) && (from.equals(eventSource) || to.equals(eventSource)))
{
customEvents.add((AjaxBehaviorEvent) event);
return;
}
}

super.queueEvent(event);
}

@Override
public void validate(FacesContext context)
{
super.validate(context);

if(from.isValid() && to.isValid())
{
for(AjaxBehaviorEvent event : customEvents)
{
SelectEvent selectEvent = new SelectEvent(this, event.getBehavior(), this.getValue());

if(event.getPhaseId().equals(PhaseId.APPLY_REQUEST_VALUES))
{
selectEvent.setPhaseId(PhaseId.PROCESS_VALIDATIONS);
}
else
{
selectEvent.setPhaseId(PhaseId.INVOKE_APPLICATION);
}

super.queueEvent(selectEvent);
}
}
}

...
}

然后将特定的事件监听器添加到您的托管 bean:

@ManagedBean
@ViewScoped
public class RangeBean implements Serializable
{
private static final long serialVersionUID = 1L;

private String range = "01/01/2015-31/12/2015";

public void onSelect(SelectEvent event)
{
Messages.addGlobalInfo("[{0}] selected: [{1}]", event.getComponent().getId(), event.getObject());
}

public String getRange()
{
return range;
}

public void setRange(String range)
{
this.range = range;
}
}

关于jsf - 如何扩展从@FacesComponent 调度的 AjaxBehaviorEvent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27911696/

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