我们在t:dataTable中遇到了h:commandLink的问题,在升级到JSF 2.1(Mojarra 2.1.28),Tomahawk20-1.1.14,PrimeFaces 5.2后,它们不再起作用了。 (旧的堆栈是JSF 1.2,Tomahawk-1.1.10,RichFaces 3.4)。问题是行动&根本不调用actionListener方法。它提交表格;但再次提醒同一页面。 基本上它是上下文菜单的自定义组件 - 它是一个特定于行的上下文菜单,在用户点击每行中的图标后显示。菜单项以编程方式生成,如下所示 -
private List<HtmlCommandLink> createMenuItems(FacesContext facesContext) {
List<HtmlCommandLink> menuItems = new ArrayList<HtmlCommandLink>();
...
ValueExpression actionsVE = extractActionsValueExpression();
Set<ActionDefinition> menuOptions = (Set<ActionDefinition>)actionsVE.getValue(facesContext.getELContext());
...
for (ActionDefinition selectItem : menuOptions) {
HtmlCommandLink menuItem = new HtmlCommandLink();
menuItem.setValue(selectItem.getLabel());
menuItem.addActionListener(new SetPropertyActionListener());
String actionEl = String.format("#{%s}", selectItem.getActionValue());
menuItem.setActionExpression(createMenuItemActionMethodExpression(facesContext, actionEl));
menuItems.add(menuItem);
}
...
return menuItems;
}
然后将此列表添加到菜单panelGroup中的encodeBegin()方法 -
中 panelGroup = new HtmlPanelGroup();
getChildren().add(panelGroup);
icon = createIcon(panelGroup);
panelGroup.getChildren().add(icon);
...
menu = new HtmlPanelGroup();
...
menu.getChildren().addAll(createMenuItems(facesContext));
menu.setId(generateId());
menu.setOnmouseover("clear_popup();");
menu.setOnmouseout("close_timer();");
panelGroup.getChildren().add(menu);
...
icon.setOnmousedown("open_popup('" + menu.getClientId(facesContext) + "', this);");
icon.setOnmouseout("close_popup();");
...
我已经检查了Stackoverflow是否存在类似的问题,并且已经验证了所有相关的先决条件(只有一个表单;列表是在PostConstruct中创建的)。还检查了BalusC的这篇文章 - commandButton/commandLink/ajax action/listener method not invoked or input value not updated;并确保提到所有要点。
以下是生成的HTML供参考 -
<a href="#" onclick="if(typeof jsfcljs == 'function'){jsfcljs(document.getElementById('form'),{'form:myDataTable:0:j_id159':'form:myDataTable:0:j_id159'},'');}return false" class="context-menu-row">Create Letter</a>
(另外,这是JSF 1.2上的旧HTML -
<a class="context-menu-row" onclick="mojarra.jsfcljs(document.getElementById('form'),{'form:myDataTable:0:j_id126':'form:myDataTable:0:j_id126'},'');return false" href="#">Create Letter</a>
)。
任何帮助/指示解决它将不胜感激。
注意: 1.这个自定义上下文菜单组件是更大框架的一部分,因此使用p:contextMenu简单地重写它不是一个可行的选择。