【发布时间】:2013-11-18 16:12:56
【问题描述】:
我有一张桌子,里面有很多自动完成框,看起来像这样......
<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})" />
当用户选择传入所选 id 以及自动完成所在行的值时,我可以调用一个名为 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 的部分,如果我可以更改它,我会没问题,但这条线是自动生成的,并且不知道怎么更新,有没有类似经历的?
【问题讨论】:
-
如何在表格中添加新行?
-
我通过 AJAX 调用添加它,该调用刚刚开始并生成 html 并对其进行 psots。完成此操作后,它会遍历并重命名表中的所有元素。
-
我发现我可以将
onItemSelect="updateHiddenInput(id,${newRow-1})"更改为onItemSelect="updateHiddenInput(id,\$(this))",然后我可以将$(this)传递给函数(如果我alert($(this))我得到object Object回来)。但是我现在不知道如何从那个开始计算出 $(this) 所在的行......! Alertnig $(this).id 什么都不做... :/ -
对不起,水有点混,它只是一个变量,告诉它在哪一行。该代码来自我在制作 AJAX 帖子时插入的片段(它告诉它要结束哪一行)它最终只是作为一个数字来标识它所在的行...
-
我不确定添加
\$(this)是否实际上是通过对象,因为无论我尝试什么,我都无法从中获取任何信息(你能发送空对象吗? .?)
标签: javascript jquery grails autocomplete rich-ui