【问题标题】:get rowIndex in rowEdit ajax event在 rowEdit ajax 事件中获取 rowIndex
【发布时间】:2015-03-27 11:01:13
【问题描述】:

我有一个可编辑的数据表(行编辑模式)。当我编辑行并单击勾选以确认新值时,我想使用 jqxvalidator 验证一些列(其中一些是必需的)。因此,当单击刻度时,validateRule(#{rowIndex}); 函数应该验证刚刚编辑的行,但传递给此函数的 rowIndex 值是 undefined

还有其他方法可以获取行索引并将其传递给 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;
    }
}

【问题讨论】:

    标签: javascript jquery jsf primefaces datatable


    【解决方案1】:

    在您以前的方法中,您不会得到rowIndex,ajax 事件只注册一次,所以rowIndex 不会像每行的循环或按钮的actionListener 一样被传递!

    对于 PrimeFaces 5.2 和

    rowIndex作为数据存储在行中,dataTable 非常依赖这种方法。

    也就是说,根据 Widget 的源代码,下面是获取触发器索引的方法:

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

    基本上event.target 是✓ 图标,最接近的tr 将是行,将此行传递给getRowMeta 函数将提取数据属性,其中之一是index

    从 PrimeFaces 5.3 开始:

    rowIndex 可以在 ajax 行为扩展的参数中找到。

    ext.params[0].value
    

    - 注意:应该在 ajax 事件的onstart 中传递(如问题所示)。

    【讨论】:

    • 正是我需要的!非常感谢!
    • 我在onstart 中一直使用event,但是在我升级到PrimeFaces 5.3 之后event 是未定义的。有什么想法吗?
    • @PanuHaaramo 你是对的,我已经更新了答案。
    • 我不知道为什么,但 ext 无法从我的 JS 回调范围访问。解决方案是从 cfg 对象中获取它,如下所示:cfg.ext.params[0].value.
    【解决方案2】:

    我认为您可以采用这种方法:-

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

    【讨论】:

    • 使用 onstart="validateRule(#{bean.dtRules.rowIndex}); " 给出的 rowIndex 值为 -1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2014-12-02
    相关资源
    最近更新 更多