【问题标题】:Can I call a jquery or javascript function in grails g:each element?我可以在 grails g:each 元素中调用 jquery 或 javascript 函数吗?
【发布时间】:2014-02-10 09:13:26
【问题描述】:

我想在 grails g:each 元素中调用 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;
});
}

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

【问题讨论】:

    标签: javascript jquery grails gsp


    【解决方案1】:

    jQuery + HTML 答案。

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

    2. 一旦你有了唯一的 ID,你需要遍历它们并运行你的过滤器。

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

    类似的事情 - 单击图标以仅显示与该类相关的项目。查看代码:

    <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 后期绑定到点击——在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 取得了很大成功,这是一个更完整的解决方案。

    【讨论】:

    • 感谢您的回复,我想循环一个表格并使用来自服务器的一组值过滤表格 td,您能告诉我该怎么做吗
    • 过滤器是指不显示表格行吗?没有用户交互——即输入一些东西来触发过滤器?如果没有用户操作,最好在服务器端进行,或者至少使用 gsp 条件。
    • 是的,不会有用户交互,我有三个样本,如血液、尿液、组织作为一个数据库表和患者列表,这些样本仍未作为另一个数据库表收集,我需要什么带来的是,我需要将未采集血液的患者名单作为一张表,将未采集尿液的患者名单作为一张表,将未采集组织的患者名单作为一张表,我需要使用血液等样本将它们分开、尿液和组织
    • 因此,您的解决方案应该是在 grails 中选择过滤列表。动态查找器可能会帮助您 - findWhereCollectedTissue(false) 或类似的。在视图中显示它并避免将其与过滤器逻辑混淆。
    • 感谢您的友好回复,但我以血液、组织和尿液为例,样本可能超过一百个,在这种情况下如何使用这个 findWhereCollected
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    相关资源
    最近更新 更多