ajax 没有为数据表中的组件调用侦听器
ajax listener not called for component in datatable
不会为数据表中的复选框调用 ajax 侦听器。
我将有问题的代码简化为以下简单(意义不大)的示例。
我有一个数据表,每一行都有一个复选框。通过单击复选框,将调用 ajax 侦听器,但不会调用它。我在数据表外还有一个复选框。单击此复选框时,将调用 ajax 侦听器。
数据表中的复选框有什么问题,或者我应该怎么做才能使其正常工作?
这是 xhtml 文件(我使用的是战斧):
<h:form>
<h:selectBooleanCheckbox id="selectAssignmentOutside" value="#{myController.assignments[100000]}">
<f:ajax render="selectionStateOutside" listener="#{myController.processAjaxBehavior}"/>
</h:selectBooleanCheckbox>
<h:outputText id="selectionStateOutside" value="#{myController.assignments[100000] ? 'selected' : 'not selected'}"/>
<p/>
<t:dataTable id="assignmentsTable" value="#{myController.allEntities}" var="row" forceIdIndexFormula="#{row.id}" preserveDataModel="false">
<h:column>
<h:outputText value="#{row.id}"/>
</h:column>
<h:column>
<h:selectBooleanCheckbox id="selectAssignment" value="#{myController.assignments[row.id]}">
<f:ajax render="selectionState" listener="#{myController.processAjaxBehavior}"/>
</h:selectBooleanCheckbox>
<h:outputText id="selectionState" value="#{myController.assignments[row.id] ? 'selected' : 'not selected'}"/>
</h:column>
</t:dataTable>
</h:form>
控制器:
@ManagedBean
@ViewScoped
public class MyController
{
private List<Entity> entities;
private Map<Long, Boolean> assignments;
public Map<Long, Boolean> getAssignments() {
if (assignments == null) {
assignments = new HashMap<>();
assignments.put( 100000L, true );
assignments.put( 100001L, true );
assignments.put( 100002L, false );
assignments.put( 100003L, false );
}
return assignments;
}
public List<Entity> getAllEntities() {
entities = new ArrayList<>();
entities.add( new Entity( 100000L ));
entities.add( new Entity( 100001L ) );
entities.add( new Entity( 100002L ) );
entities.add( new Entity( 100003L ) );
return entities;
}
public void processAjaxBehavior(AjaxBehaviorEvent event)
{
System.out.println("#### processAjaxBehavior");
// here some things should be done in model
// and the component re-rendered by ajax component shows the result
}
}
如果设置了属性 "forceIdIndexFormula",Tomahawk 的数据表在生成客户端 ID 时有一个 bug。
从 "t:datatable" 中删除属性 "forceIdIndexFormula" 后,它按预期工作。
不会为数据表中的复选框调用 ajax 侦听器。 我将有问题的代码简化为以下简单(意义不大)的示例。
我有一个数据表,每一行都有一个复选框。通过单击复选框,将调用 ajax 侦听器,但不会调用它。我在数据表外还有一个复选框。单击此复选框时,将调用 ajax 侦听器。 数据表中的复选框有什么问题,或者我应该怎么做才能使其正常工作?
这是 xhtml 文件(我使用的是战斧):
<h:form>
<h:selectBooleanCheckbox id="selectAssignmentOutside" value="#{myController.assignments[100000]}">
<f:ajax render="selectionStateOutside" listener="#{myController.processAjaxBehavior}"/>
</h:selectBooleanCheckbox>
<h:outputText id="selectionStateOutside" value="#{myController.assignments[100000] ? 'selected' : 'not selected'}"/>
<p/>
<t:dataTable id="assignmentsTable" value="#{myController.allEntities}" var="row" forceIdIndexFormula="#{row.id}" preserveDataModel="false">
<h:column>
<h:outputText value="#{row.id}"/>
</h:column>
<h:column>
<h:selectBooleanCheckbox id="selectAssignment" value="#{myController.assignments[row.id]}">
<f:ajax render="selectionState" listener="#{myController.processAjaxBehavior}"/>
</h:selectBooleanCheckbox>
<h:outputText id="selectionState" value="#{myController.assignments[row.id] ? 'selected' : 'not selected'}"/>
</h:column>
</t:dataTable>
</h:form>
控制器:
@ManagedBean
@ViewScoped
public class MyController
{
private List<Entity> entities;
private Map<Long, Boolean> assignments;
public Map<Long, Boolean> getAssignments() {
if (assignments == null) {
assignments = new HashMap<>();
assignments.put( 100000L, true );
assignments.put( 100001L, true );
assignments.put( 100002L, false );
assignments.put( 100003L, false );
}
return assignments;
}
public List<Entity> getAllEntities() {
entities = new ArrayList<>();
entities.add( new Entity( 100000L ));
entities.add( new Entity( 100001L ) );
entities.add( new Entity( 100002L ) );
entities.add( new Entity( 100003L ) );
return entities;
}
public void processAjaxBehavior(AjaxBehaviorEvent event)
{
System.out.println("#### processAjaxBehavior");
// here some things should be done in model
// and the component re-rendered by ajax component shows the result
}
}
如果设置了属性 "forceIdIndexFormula",Tomahawk 的数据表在生成客户端 ID 时有一个 bug。 从 "t:datatable" 中删除属性 "forceIdIndexFormula" 后,它按预期工作。