1

我在我的 xhtml 内的 dataTable 的列中有一个动态创建的 commandButton,并且我为它定义的 methodExpression 没有被调用。以下是详细说明:

我创建这样的按钮:

Column column = (Column) createComponent(Column.COMPONENT_TYPE);
UIOutput columnTitle = (UIOutput) createComponent(UIOutput.COMPONENT_TYPE);
columnTitle.setValue("Search");
column.getFacets().put("header", columnTitle);
table.getChildren().add(column);

CommandButton button = (CommandButton) createComponent(CommandButton.COMPONENT_TYPE);
button.setIcon("ui-icon-search");
button.setTitle("Search");
button.setUpdate(":mainForm:viewerPanel, :mainForm:growl");

//Action defined here
MethodExpression action = createMethodExpression("#{viewerMB.searchNode(item.value)}", null, Object.class);
button.setActionExpression(action);

column.getChildren().add(button);

按钮显示,dataTable正常渲染。通过检查组件树,我看到它都在这个结构中定义

<h:form id="mainForm">
    <p:dialog>
        <p:panel>
            <p:dataTable>
                <p:column>
                    <p:commandButton/>
                <p:column>
            </p:dataTable>
        </p:panel>
    </p:dialog>
</h:form>

注意:这不是我的实际代码,这只是说明我页面内部结构的示例

我使用此处找到的以下方法创建我的 MethodExpression :

public static MethodExpression createMethodExpression(String expression, Class<?> returnType,
    Class<?>... parameterTypes){
    FacesContext facesContext = FacesContext.getCurrentInstance();
    return facesContext.getApplication().getExpressionFactory()
        .createMethodExpression(facesContext.getELContext(), expression, returnType, parameterTypes);
}

但是当我单击按钮时,该方法没有被调用,它是在引用的 ManagedBean 中定义的,这里是:

public void searchNode(Object object){
    try{
        viewer.push(viewerBO.getViewNode(object));
    } catch (BusinessException e){
        FacesUtil.addErrorMessage(e.getMessage());
    }
}

所以它是一个接收对象作为参数的 void 方法。

现在这是我的疑问:

  • 我是否以错误的方式创建 MethodExpression?item.value无效吗?item是为我的 dataTable 的var属性定义的值
  • 我在这里错过了一些步骤吗?也许我的树结构有问题
  • 关于为什么它可能不会被调用的任何其他想法?
4

0 回答 0