2015-01-05 6 views
0

Ajax прослушиватель не вызывается для флажка, который находится в datatable. Я уменьшил проблематичный код до следующего простого (и не очень значимого) примера.ajax прослушиватель не вызван для компонента в datatable

У меня есть данные и в каждой строке флажок. Нажимая на флажке, вызывается вызывающий ajax-слушатель, но он не вызывается. У меня также есть флажок вне данных datatable. При нажатии этого флажка вызывается прослушиватель ajax. Что не так с флажками в datatable или что мне делать, чтобы заставить его работать?

Вот файл 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

Лучшая практика диктует, что вы не должны выполнять бизнес-логику в геттере. Затем вы хотите подтвердить, что нет никакой молчаливой ошибки преобразования/проверки, вызывающей удушение запроса (смотрите в консоли JS) – kolossus

+0

В firefox веб-консоли ошибок нет. Нажав на флажок (независимо от того, внутри или вне данных datatable), запрос JSF выполняется на всех этапах, включая INVOKE_APPLICATION (проверяется с помощью PhaseListener). – OlliS

+0

По умолчанию, ничего не похоже на вашу настройку. Попробуйте изменить имя вашего метода ajax (и удалить параметр «AjaxBehaviorEvent» .Какой версией JSF вы работаете? – kolossus

ответ

1

DataTable Tomahawk имеет в bug в генерации идентификатора клиента, если атрибут "forceIdIndexFormula" установлен. После удаления атрибута «forceIdIndexFormula» из «t: datatable» он работает так, как ожидалось.