0
未調用ajax監聽器的數據表中的複選框。 我將有問題的代碼簡化爲以下簡單(並且不太有意義)的示例。未調用數據表中的組件的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
}
}
最佳實踐表明,您不應該在getter中執行業務邏輯。然後,您要確認沒有導致請求窒息的沉默轉換/驗證錯誤(查看您的JS控制檯) – kolossus
Firefox控制檯中沒有錯誤。點擊一個複選框(不管數據表內部還是外部),讓JSF請求運行所有階段,包括INVOKE_APPLICATION(用PhaseListener檢查)。 – OlliS
在表面上,你的設置沒有任何問題。嘗試更改ajax方法的名稱(並刪除'AjaxBehaviorEvent'參數。您運行的是哪個版本的JSF? – kolossus