未使用正确的引用调用自动完成

Autocomplete not using correct reference call

本文关键字:调用 引用 未使用      更新时间:2023-09-26

我有一个创建自动补全的函数。在正常情况下,它工作得很好。函数调用的一个例子是:

getList('employee', { type: 'auto', id: 'txtMgrID', callback: function (id) { $('#hidMgrID').val(id); } });

这个函数调用对我来说工作得很好——它所做的是使用员工列表为文本输入元素txtMgrID创建一个自动补全。'callback'设置了自动补全的select函数——在这个例子中,设置了一个隐藏的输入元素'hidMgrID'和自动补全id值。再次-正常工作只是很好(有这个运行在我的网站上的多个地方。)

我遇到的问题是当我在一个循环中构建这个。我有一个对话框窗口,将有多个员工自动完成。因此,我使用循环构建对话框的部分(因此它创建了txtMgr0 - txtMgr4,以及hidMgrID0 - hidMgrID4)。对话框可以创建任意数量的这些(取决于给定经理有多少直接雇员),这就是我使用循环来完成此操作的原因。

打开对话框后,我使用另一个for循环来进行自动完成创建调用。我的代码是:

for (x = 0; x < mgrcnt; x++) { 
    getList('employee', { type: 'auto', id: 'txtMgr' + x, callback: function (id) { $('#hidMgrID'+x).val(id); } }); 
}

现在,我的问题是,所有的自动完成文本框更新最后的hidID…这就好像,在我的例子中,$('#hidMgrID'+x)计算为$('#hidMgrID4')对于循环中的每个getList调用。奇怪的是,如果我在get列表调用之前(作为循环的一部分),也在回调函数引用中(在jquery .val引用之前),当对话框加载时,它会给我#hidMgrID0然后1,然后2等,然后当我在文本元素中输入一个管理器时,它会为所有这些发出#hidMgrID4警报。

我不明白为什么会发生这种事…任何帮助解决这个问题的人都将不胜感激!

提前感谢!

克里斯

您有一个作用域问题:您正在创建一个函数并将其存储到回调属性中,但是x变量没有立即求值。因此,当函数执行并计算x时,x变量被赋值,因为for已经结束。

一个可能的解决方案是使用这个想法:

你在做什么:

var arr=[];
for(var i=0;i<10;i++){
    arr[i] =function(){
        console.log(3+i);
    }
}
console.log(i); // 10
arr[0](); // 13
arr[1](); // 13

你应该怎么做:

var arr=[];
for(var i=0;i<10;i++){
    (function(){
    var x=i;
        arr[x] =function(){
            console.log(3+x);
        }
    }())
}
console.log(i); // 10
arr[0](); // 3
arr[1](); // 4

经过更多的研究,我最终得出了我自己的答案-基本上我必须创建一个外部函数来返回我需要的函数:

function makeCallback(i) { 
    return function(id) { $('#hidMgr'+i).val(id); } 
}

那么我就可以在for循环中使用它了:

for (x = 0; x < mgrcnt; x++) { 
    getList('employee', { type: 'auto', id: 'txtMgr' + x, callback: makeCallback(x) }); 
}

我的问题解决了