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