自动填充不使用正确的参考调用

时间:2014-06-19 20:28:19

标签: javascript jquery for-loop autocomplete

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

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。

我不明白为什么会发生这种情况......任何有助于解决这个问题的帮助都会受到赞赏!

提前致谢!

克里斯

2 个答案:

答案 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) }); 
}

这解决了我的问题。