【问题标题】:Autocomplete not using correct reference call自动完成未使用正确的参考调用
【发布时间】:2014-06-21 04:11:46
【问题描述】:

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

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

这个函数调用对我来说很好用——它的作用是使用员工列表为文本输入元素 txtMgrID 创建一个自动完成功能。 “回调”在自动完成上设置选择功能 - 在此示例中,使用自动完成 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 警报。

我不明白为什么会发生这种情况......如果能帮助解决这个问题,我们将不胜感激!

提前致谢!

克里斯

【问题讨论】:

    标签: javascript jquery for-loop autocomplete


    【解决方案1】:

    您有一个范围问题:您正在创建一个函数并将其存储到回调属性中,但 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
    

    【讨论】:

    • 不-这不正确...我最终要做的是创建一个返回我需要的函数的函数...function makeCallback(i) { return function(id) { $('#hidMgr'+i).val(id); } } 然后引用我的回调来使用makeCallback!
    【解决方案2】:

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

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

    这解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2012-04-18
      相关资源
      最近更新 更多