2015-01-05 12 views
0

데이터 테이블에있는 확인란에는 아약스 수신기가 호출되지 않습니다. 문제가있는 코드를 다음의 단순한 (그다지 의미가없는) 예제로 축소했습니다.데이터 테이블의 구성 요소에 대해 아약스 수신기가 호출되지 않습니다.

나는 데이터 테이블을 가지고 있으며 모든 행에 체크 박스가 있습니다. 체크 박스를 클릭하면 아약스 청취자가 호출되지만 호출되지는 않습니다. 나는 데이터 테이블 밖에있는 체크 박스를 가지고있다. 이 체크 박스를 클릭하면 아약스 리스너가 호출됩니다. 데이터 테이블의 확인란이 잘못되었거나 제대로 작동하려면 어떻게해야합니까?

<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> 

컨트롤러 : 여기

(나는 토마 호크를 사용하고 있습니다)을 XHTML 파일입니다

@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

토마 호크의 데이터 테이블은 클라이언트 ID를 생성에 bug이있는 경우 속성 "forceIdIndexFormula" 설정됩니다. "forceIdIndexFormula"특성을 "t : datatable"에서 제거한 후 예상대로 작동합니다.