h:命令链接里面:在JSF 2.1升级后,dataTable无法正常工作

时间:2016-04-16 01:40:33

标签: jsf-2

我们在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简单地重写它不是一个可行的选择。

0 个答案:

没有答案