2015-01-28 3 views
2

У меня есть редактируемый dataTable (режим редактирования строк). Когда я редактирую строку и щелкаю галочкой, чтобы подтвердить новое значение, я хотел бы проверить некоторые столбцы (некоторые из них требуются) с помощью jqxvalidator. Таким образом, при нажатии галочки функция validateRule(#{rowIndex}); должна проверять строку, которая была только что отредактирована, но значение rowIndex, переданное этой функции, равно undefined.get rowIndex в rowEdit ajax event

Есть ли другой способ получить индекс строки и передать его функции JavaScript?

Некоторые из моих Xhtml код:

<p:dataTable id="tblRule" var="item" value="#{bean.ruleList}" binding="#{bean.dtRules}" editable="true" 
    editMode="row" rowIndexVar="rowIndex" widgetVar="tblRuleWidget"> 
    <p:ajax event="rowEdit" listener="#{bean.doEdit}" update="tblRule" onstart="validateRule(#{rowIndex}); " /> 
    <p:ajax event="rowEditCancel" onstart="hideValidatorMsg();" /> 

    <p:column> 
     <p:rowEditor /> 
    </p:column> 
    <p:column id="colRuleId" headerText="Id" > 
     <h:outputText value="#{item.id}" /> 
    </p:column> 
    <p:column id="colRuleCode" headerText="Code"> 
     <p:cellEditor> 
      <f:facet name="output"> 
       <h:outputText value="#{item.code}" /> 
      </f:facet> 
      <f:facet name="input"> 
       <p:inputText id="inRuleCode" value="#{item.code}" onblur="hideValidatorMsg(); validateRule(#{rowIndex});" /> 
      </f:facet> 
     </p:cellEditor> 
    </p:column> 
</p:dataTable> 

JavaScript:

function validateRule(rowIdx) { 
    var namespace = 'view' + $('[id$=hidNamespace]').val(); 

    $('#' + namespace + '\\:form1').jqxValidator({ 
     animation : 'none', 
     scroll : false, 
     arrow : false, 
     rules : [ { 
      input : '#' + namespace + '\\:form1\\:tabView\\:tblRule\\:' + rowIdx + '\\:inRuleCode', 
      message : 'Required field!', 
      action : 'blur', 
      position : 'top', 
      rule : 'required' 
     } ] 
    }); 

    if ($('#' + namespace + '\\:form1').jqxValidator('validateInput', '#' + namespace + '\\:form1\\:tabView\\:tblRule\\:' + rowIdx + '\\:inRuleCode') === false) { 
     return false; 
    } else { 
     return true; 
    } 
} 

ответ

4

В вашем предыдущем подходе вы не будете получите rowIndex, событие ajax регистрируется один раз, поэтому rowIndex не будет передан как будто это петля или actionListener кнопки для каждой строки!

Для PrimeFaces 5.2 и <

The rowIndex хранится в строке в качестве данных, то Datatable зависит вполне достаточно на этой методологии.

Тем не менее, и на основе исходного кода виджета, вот как получить индекс triggerer:

PF('dataTableWV').getRowMeta($(event.target).closest('tr')).index 

Основном event.target является значок ✓, ближайший tr бы строку, передавая это строка до getRowMeta Функция будет извлекать атрибуты данных, один из которых - index.

Начиная с PrimeFaces 5,3:

rowIndex можно найти в Params о продлении АЯКС поведения.

ext.params[0].value 

- Примечание: что должно быть передано в onstart из Аякса события (как в вопросе).

+0

То, что мне нужно! Большое спасибо! – peterremec

+0

Добро пожаловать. –

+0

Я использовал 'event' в' onstart', но после того, как я обновился до PrimeFaces 5.3, 'event' не определено. Есть идеи? –

0

Я думаю, что вы можете принять этот подход: -

<p:dataTable binding="#{YourValue}" and so on ...> 
    <p:column> 
     <p:commandButton ... onclick="return getMyRowIndex(#{YourValue.rowIndex})" /> 
    </p:column> 
</p:dataTable> 
+0

Использование 'onstart =" validateRule (# {bean.dtRules.rowIndex}); '' дает значение 'rowIndex' -1. – peterremec