0

我有一张桌子,里面有一堆自动完成的盒子,看起来像这样......

<richui:autoComplete style="width:500px" name="objSelect[${newRow-1}].id" value= "" action="${createLinkTo('dir': 'object/searchAJAX')}" forceSelection = "true" maxResultsDisplayed="20" minQueryLength ="3" onItemSelect="updateHiddenInput(id,${newRow-1})" />

我有它来调用一个函数updateHiddenInput,当用户选择一个传入所选 id 的值以及自动完成所在的行时调用的函数(此函数然后使用传入的值更新同一行中的隐藏字段,与身份证)。该函数如下所示: -

function updateHiddenInput(id, num){
    var objID = "objectID[" + num + "].id";
    $(document.getElementById(objID)).val(id);
}

一切正常,直到我在表中添加新行,这会将所有内容向下推一行并阻止自动完成更新正确的行隐藏字段(因为它仍然引用旧行)。

目前,我有另一段代码在插入新行时通过并重命名所有字段,但我不知道如何更新自动完成以使其通过正确的行号,有人知道我可以如何改变吗?

我能想到的唯一其他选择是只通过对象本身以及我可以根据对象找到隐藏的ID,但我不知道如何做到这一点,任何建议都非常感谢!:S

我试过 onItemSelect="updateHiddenInput(id,${newRow-1})" 改成 onItemSelect="updateHiddenInput(id,this)"

从理论上讲,我可以只通过自动完成对象,然后从那里遍历页面以找到我要更新的隐藏字段。但是,当我尝试在我的函数中使用该对象时,例如: -

var mynumber = $(myobject).closest('td').find('input').val();

当我尝试提醒该值时,总是会返回“未定义”...

alert(myobject)如果我只是在它返回的函数中放入一个,AutoComplete instance0 autoLook[0].id但如果我插入了新行,则 id 值不会改变(即对象 id 现在是 autoLook[3].id 但它仍然显示 [0],我认为可能是问题的一部分,但我现在知道如何更新这个值......

我注意到在 html 中查看 firebug 时,有一个链接到自动完成的 /script 可能是问题所在,因为添加新行时这不会更新,我可以看到对旧/原始 id 值的多个引用(请参阅下面)所以也许传递的this不是传递当前对象的值…?

<script type="text/javascript">
var autoCompleteDataSource = new YAHOO.util.XHRDataSource("/Framework/object/searchAJAX");
autoCompleteDataSource.responseType = YAHOO.util.XHRDataSource.TYPE_XML;
autoCompleteDataSource.responseSchema = {
resultNode : "result",
fields : [
{ key: "name" },
{ key: "id" }
]
};
;
autoComplete = new YAHOO.widget.AutoComplete('autoLook[0].id','ad186a42e45d14d5cde8281514f877e42', autoCompleteDataSource);
autoComplete.queryDelay = 0;
autoComplete.prehighlightClassName = 'yui-ac-prehighlight';
autoComplete.useShadow = false;
autoComplete.minQueryLength = 3;
autoComplete.typeAhead = false;
autoComplete.forceSelection = true;
autoComplete.maxResultsDisplayed = 20;
autoComplete.shadow = false;
var itemSelectHandler = function(sType, args) {
var autoCompleteInstance = args[0];
var selectedItem = args[1];
var data = args[2];
var id = data[1];
updateHiddenInput(id,this) };
autoComplete.itemSelectEvent.subscribe(itemSelectHandler);
</script>

到目前为止,我感谢 user1690588 迄今为止的所有帮助!:)

在进一步挖掘中,我确信我的问题归结为autoComplete = new YAHOO.widget.AutoComplete('autoLook[0].id','a5b57b386a2d1c283068b796834050186', autoCompleteDataSource);特别是其输入的部分,autoLook[].id如果我可以改变它,我就可以了,但是这条线是自动生成的,我不知道如何更新它,有没有人有类似的经历?

4

1 回答 1

1

我对您的 gsp 页面不太了解,但我尝试过:

我的普惠制:

<!DOCTYPE html>
<html>
<head>
<resource:autoComplete skin="default"/>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript">
    var counter = ${list.size()};

    function asd() {
        jQuery.ajax({
            url: " ${createLink(controller: 'oauthCallBack', action: 'testAuto')}",
            data: "idx=" + counter++,
            success: function (data) {
                jQuery("#tableId").append("<tr><td>" + data + "</td></tr>");
            }
        });
    }

    function updateHiddenInput(id, tg) {
        jQuery(tg).val(id);
    }
</script>
</head>

<body>
<g:form>
<table id="tableId">
    <g:each in="${list}" var="vr" status="idx">
        <tr>
            <td>
                <richui:autoComplete name="name" id="uniqueId${idx}" action="${createLinkTo('dir': 'oauthCallBack/test')}" onItemSelect="updateHiddenInput(id, someId${idx})"/>
                <g:hiddenField name="someName" id="someId${idx}" value=""/>
            </td>
        </tr>
    </g:each>
</table>
</g:form>
<button onclick="asd()">Add</button>
</body>
</html>

我的行动:

def testAuto() {
    render template: 'addNew', model: [idx: params.idx]
}

我的模板(添加新):

<richui:autoComplete name="name" id="uniqueId${idx}" action="${createLinkTo('dir': 'oauthCallBack/test')}"
                 onItemSelect="updateHiddenInput(id, someId${idx})"/>
<g:hiddenField name="someName" id="someId${idx}" value=""/>

试试这个..,。



编辑................................................. .....................................

我认为您已成功更新所有输入字段名称。然后您可以编辑隐藏字段,例如:

看法:

<tr class="dummyClass">
    <td>
        <richui:autoComplete name="name[${idx}]" id="uniqueId[${idx}]" action="${createLinkTo('dir': 'oauthCallBack/test')}" onItemSelect="updateHiddenInput(id, this)"/>
        <g:hiddenField name="someName[${idx}]" id="someId[${idx}]" value=""/>
    </td>
</tr>

jQuery:

function updateHiddenInput(id, tg) {
    jQuery(tg._elTextbox).closest("tr.dummyClass").find("input[type=hidden]").val(id);
}


编辑................................................. .....................................

为什么你需要改变'id'?更改名称足以按顺序发送值。并且您可以像上面编辑一样更新没有 id 的隐藏字段。

如果您仍然需要更改 id,那么您可以通过克隆 tr 来更改它,然后使用正则表达式。有关完整的工作示例,请参阅此答案

于 2013-11-19T18:26:47.327 回答