HtmlCommandButton是在自己的dataTable渲染中创建的,不能使用ActionListener或Action

时间:2013-12-10 23:00:22

标签: jsf jsf-2.2

我创建了一个dataTable组件,我想在标题中添加一个隐藏列按钮,但该按钮不会触发该事件。

这是标头的编码方法。我在函数呈现标题中,当标题必须写入隐藏自己的按钮时调用此标题。

private void encodeHideColumnOption(FacesContext context,
                   UIComponent table, ResponseWriter writer) throws IOException {

    HtmlCommandButton hide = (HtmlCommandButton) context
            .getApplication()
            .createComponent(HtmlCommandButton.COMPONENT_TYPE);
    hide.setId("hb_" + model.getColumnIndex());
    hide.setValue("X");
    AjaxBehavior ajax = new AjaxBehavior();
    ajax.setRender(Arrays.asList(":" + table.getParent().getClientId(context),
                                 ":messagePanel"));
    ajax.setExecute(Arrays.asList(":form"));
    hide.addClientBehavior(hide.getDefaultEventName(), ajax);
    hide.addActionListener(new ActionListenerHideOption());
    table.getChildren().add(hide);
    hide.encodeAll(context);
}

这是ActionListener类

@SessionScoped
public class ActionListenerHideOption implements ActionListener, Serializable {

    public ActionListenerHideOption(){
    }

    @Override
    public void processAction(ActionEvent event)
                              throws AbortProcessingException {
        System.out.println("Action Listener Fired :D");
    }

}

但是当我点击按钮时没有发生任何事情,我用这个问题验证:h:commandLink / h:commandButton is not being invoked但是不起作用。你能救我吗?

----编辑----

我正在尝试不同的方法,但我真的不明白为什么我用这种方式工作

 <h:commandButton id="hb_x" value="&empty;">
      <f:actionListener type="package.ActionListenerHideOption" />                    
      <f:ajax render=":form:dataTable" onevent="tableReset" />
 </h:commandButton>

但另一种方式却没有... anyOne可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

这是解决方案。在渲染dataTable组件(我的dataTable组件)时,我必须添加此函数来解码组件(dataTable)

@Override
public void decode(FacesContext context, UIComponent component) {
    for (UIComponent child : component.getChildren()) {
            for (UIComponent grandChild : child.getChildren()) {
                if (grandChild instanceof HtmlCommandButton) {
                    grandChild.decode(context);
                }
            }
    }
}

这允许在我的dataTable中的所有HtmlCommandButton中触发解码过程...我认为它将与HtmlCommandLink一起使用,但未经过测试。可能是更好的代码,如果anyOne可以在性能和其他方面做更好的代码,欢迎:)

----编辑----

我做了一个更好的解决方案,它解码了我的dataTable上的所有内容。

@Override
public void decode(FacesContext context, UIComponent component) {
    decodeChildren(context, component);
}

public void decodeChildren(FacesContext context, UIComponent component) {
    for (UIComponent child : component.getChildren()) {
        if (!child.getChildren().isEmpty()) {
            decodeChildren(context, child);
        }else{
            child.decode(context);
        }
    }
}

就是这样。 =)