Jquery使用动态值绑定/生活

时间:2012-11-06 09:53:44

标签: javascript jquery html data-binding bind

我将函数绑定到html元素。

循环中有一些数据在每次迭代时都会发生变化

data = {
    networkId: networkId,
    network_avatar: network_avatar,
    network_user_name: network_user_name,
}

我在这里绑定它:

$("#element"+i).bind(function(){ 
    change(data);
}

功能是:

function change(data){
    console.log(data);
}

每次迭代时data变量中应该有不同的数据。

但它始终包含最后一次迭代的内容 为什么jQuery会更改已使用change()函数

绑定的数据

2 个答案:

答案 0 :(得分:1)

尝试在另一个函数中嵌套函数以创建闭包。闭包的技巧是你必须有两个嵌套函数,一个内部函数和一个外部函数。内部函数将拥有外部函数变量&的副本。从某种意义上说,参数继承了它的范围。在我的示例中,bindClick用作外部函数,而对$ .click()的调用中的匿名函数用作内部函数。这导致匿名内部函数将传递给bindClick()方法的数据对象保留为参数。当我们在一个循环中运行它时,我们基本上会得到10个闭包,它们记住了它们用它们创建的数据对象。

直播示例:http://jsfiddle.net/cDwEk/1/

function bindClick(data){
  $("#element" + data.myProp).click(function(){
         //anonymous function will remember state of outer functions variables.
         alert(data.myProp);     
    });    
}

//ForLoop
for(var i = 0; i < 10; i++){
    var data = {myProp:i};
    //Pass function to another function to create closure.
    bindClick(data);
}

答案 1 :(得分:1)

首先,不要使用名为“data”或“window”的全局变量或其他类似的东西。如果您的可变数据声明在视觉区域的某处,请使用“var”bareword。

当调用事件处理程序时,它调用“更改”函数并在其中发送当前数据值。你需要的是为每个处理程序声明自己的数据。你应该使用“var”。像:

$("#element"+i).bind(function(){
   var currentDataValue = new CopyData(data);
   change(currentDataValue);
}

function CopyData(object) {
   var data = {};
   for (var val in object)
      data[val] = object[val];
   return data;
}

我想它应该有所帮助。但我不太确定。