我可以在grails中调用jquery或javascript函数:每个元素?

时间:2014-02-10 09:13:27

标签: javascript jquery grails gsp

我想在grails中调用jquery函数:每个元素,我在页面加载时使用函数调用来过滤具有循环的表,如下所示

   <g:each in="${sampleTypes}" status="i" var="sampleType">
<div class="uniq">${sampleType}</div>
<table id="sampleTable">
    <thead>
        <tr>
            <th class="no-sort"><g:message code="labWorkItem.testUnit.label"
                    default="CustomerId" /></th>

            <th class="no-sort"><g:message code="labWorkItem.testUnit.label"
                    default="OrderNo" /></th>
            <th class="no-sort"><g:message code="labWorkItem.testUnit.label"
                    default="DateCreated" /></th>
            <th class="no-sort"><g:message code="labWorkItem.testUnit.label"
                    default="Test unit" /></th>

            <th class="no-sort no-visible"><g:message
                    code="labWorkItem.sampleType.label" default="Sample Type" /></th>
        </tr>
    </thead>
    <tbody>
        <g:each in="${labWorkItemInstance}" status="a" var="labWorkItem">
            <tr class="${(a % 2) == 0 ? 'even' : 'odd'}">
                <td>
                    ${labWorkItem?.order?.customer?.customerId}
                </td>
                <td>
                    ${labWorkItem?.order?.orderNo}
                </td>
                <td>
                    ${labWorkItem?.order?.dateCreated}
                </td>
                <td >
                    ${labWorkItem?.testUnit}
                </td>
                <td id = "labSample">
                    ${labWorkItem?.testUnit?.sampleType}
                </td>
            </tr>
        </g:each>
    </tbody>
</table>
<g:textField name="singleValue" value="Blood" id="someHiddenField"/>
</g:each>

我使用“uniq”类过滤表

function typeSampleCollected() {
jQuery.fn.dataTableExt.afnFiltering.push(function(oSettings, aData,
        iDataIndex) {
    if (oSettings.nTable.id != "sampleTable") {
        return true;
    }

        var uniq = jQuery("div.uniq").html();
alert(uniq);
     jQuery("#someHiddenField").val(uniq);
     var someHiddenField = jQuery("#someHiddenField").val()
    if(someHiddenField){
        //var sampleValue = jQuery("#someHiddenField").val();
        //alert(sampleValue.toString());
    if (someHiddenField != aData[4]){
        console.log("sampleType"+someHiddenField);
        console.log("aData"+aData[4]);
        return false;
        }
    }
    else{
        console.log("else condition");
        }
    return true;
});
}

问题是,它在第​​一次页面加载时执行,只有执行其他循环的第一个数据保持不变,我希望其余数据也能执行。

1 个答案:

答案 0 :(得分:0)

jQuery + HTML答案。

  1. 您生成的HTML将会出错,因为ID“someHiddenField”将会重复。 id必须在HTML文档中是唯一的。查看要检查的文档的来源。复制到IDE或使用w3c validator进行检查。

  2. 获得唯一ID后,您需要迭代它们并运行过滤器。

  3. 我不确定是否通过过滤器将信息发送回服务器。即,文本血液仅导致与正在显示的血液有关的内容。我没有在您的代码中看到任何事件。代码不完整吗?

    类似的事情 - 点击图标只显示与该课程相关的项目。查看代码:

    <g:each in="${assetTypes}" status="i" var="assetType">
          <li>
              <a href="javascript:void(0)" name="assetTypeSelector" id="assetTypeSelector-${assetType.iconId}" class="icon-small-assetType-${assetType.iconId} ${(activeAssetType.id.toString()==assetType.id.toString()?' selected':'')}"><span class="atext">${assetType.name?.encodeAsHTML()}</span></a>
          </li>
    </g:each>
    

    我使用delegate()将jQuery延迟绑定到click - 在1.7 jQuery之后使用go()。 javascript必须在grails视图中,因为我使用gsp标记。使用delegate(),它可以在任何地方:

        /* Change asset types */
        jQuery('body').delegate('[name=assetTypeSelector]', 'click', function() {
            var newAssetIconId = jQuery(this).attr("id").split("-").pop();
    
            // set the asset type.
            ${remoteFunction(controller: 'assetType', action: 'selector', name: 'assetTypeSelector',  update: 'assetTypeSelector', params:'\'currentAssetTypeIconId=\' + newAssetIconId')}
    
        });
    

    或者我们在DataTables取得了很大的成功,这是一个更完整的解决方案。