我有一个创建自动复合的功能。在正常情况下它工作得很好。函数调用的一个例子是:
getList('employee', { type: 'auto', id: 'txtMgrID', callback: function (id) { $('#hidMgrID').val(id); } });
这个函数调用对我来说很合适 - 它的作用是使用员工列表为文本输入元素txtMgrID创建一个自动完成。 'callback'在自动完成上设置select函数 - 在本例中,使用自动完成id值设置隐藏的输入元素'hidMgrID'。再次 - 通常工作正常(在我的网站上运行多个位置。)
我遇到的问题是当我在循环中构建它时。我有一个会有多个员工自动填充的对话窗口。所以我用循环构建对话框的部分(因此它创建了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); } });
}
现在,我遇到的问题是所有自动填充文本框都会更新LAST hidID ......就像在我的示例中,$('#hidMgrID'+ x)计算结果为$('#hidMgrID4')对于循环中的每个getList调用。奇怪的是,如果我在get list调用之前(作为循环的一部分)以及回调函数引用(在jquery .val引用之前)都进行了警报调用,并且在对话框加载时,它将给我#hidMgrID0通过所有这些,然后是1,然后是2等,然后当我在文本元素中输入管理器时,它会提醒所有人#hidMgrID4。
我不明白为什么会发生这种情况......任何有助于解决这个问题的帮助都会受到赞赏!
提前致谢!
克里斯
答案 0 :(得分:0)
您有一个范围问题:您正在创建一个函数并将其存储到回调属性中,但不会立即评估x变量。所以当你的函数执行并且x被计算时,x变量是mgrcnt,因为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
答案 1 :(得分:0)
经过更多研究后,我最终得出了自己的答案 - 基本上我必须创建一个返回我需要的函数的外部函数:
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) });
}
这解决了我的问题。