2015-01-05 70 views
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 
    } 
} 
+0

最佳實踐表明,您不應該在getter中執行業務邏輯。然後,您要確認沒有導致請求窒息的沉默轉換/驗證錯誤(查看您的JS控制檯) – kolossus

+0

Firefox控制檯中沒有錯誤。點擊一個複選框(不管數據表內部還是外部),讓JSF請求運行所有階段,包括INVOKE_APPLICATION(用PhaseListener檢查)。 – OlliS

+0

在表面上,你的設置沒有任何問題。嘗試更改ajax方法的名稱(並刪除'AjaxBehaviorEvent'參數。您運行的是哪個版本的JSF? – kolossus

回答

1

戰斧的表具有bug在生成客戶端ID如果屬性 「forceIdIndexFormula」已設置。 從「t:datatable」中刪除屬性「forceIdIndexFormula」後,它按預期工作。