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プロパティに定義された値です
- ここでいくつかのステップがありませんか?ツリー構造に問題があるのかもしれません
- 呼び出されない理由について他に何か考えはありますか?