2012-04-16 62 views
4

我有以下代码:如何传递给jQuery的岗位元素的循环中

for (_field in _fields) { 
    $.post(
     '/api/fields', 
     { id: _field.id }, 
     function(data, _field) { 
      alert(data); 
     } (data, _fields[_field) 
    ); 
} 

我到_fields[_field]元素传递给从jQuery返回数据的功能,因为失去了参考正确的对象在循环中。问题在于,在定义post函数应具有_field参数时,还必须为数据指定参数,否则数据将被_field覆盖。

当前数据返回为undefined,因为我没有在循环内部定义数据对象。我也尝试过null,但那也只是返回null。我正在寻找一种方法来传递元素而不覆盖从post函数返回的数据。

有没有什么办法可以解决这个问题,或者是否有其他方法可以做到所需?

回答

7

你想要一个函数工厂函数  —创建一个函数的函数:

for (_fieldName in _fields) { 
    $.post('/api/fields', 
    { 
     // Unrelated, but I think this bit is wrong; shouldn't it be 
     // `id: _fields[_fieldName].id` ? You're trying to use `.id` on 
     // a string -- see below for a full update 
     id: _fieldName.id 
    }, 
    makeHandler(_fields[_fieldName]) 
    ); 
} 
function makeHandler(field) { 
    return function(data) { 
     // Use `data` and `field` here 
    }; 
} 

注意,在我们传递到$.post对象初始化,我们调用makeHandler它运行,返回我们将会传入的函数$.post。然后,该功能被称为$.post完成时,并先后获得了data论点$.post给它还有field参数makeHandler,因为它是一个封闭在通话的背景下makeHandler,其中包括field说法。更多:Closures are not complicated


注意,在上面的代码,我改变了你的变量_field_fieldName更加明确:for..in循环变量是一个字符串,该名称的属性的。另请参阅评论,我认为你试图在错误的地方使用.id。这是我觉得你真的想:

for (_fieldName in _fields) { 
    _field = _fields[_fieldName]; 
    $.post('/api/fields', 
    { 
     id: _field.id 
    }, 
    makeHandler(_field) 
    ); 
} 
function makeHandler(field) { 
    return function(data) { 
     // Use `data` and `field` here 
    }; 
} 

还要注意,如果_fields是一个数组,你不应该使用它for..in无保障。更多:Myths and realities of for..in

+1

+1非常优雅的解决方案。 – 2012-04-16 08:56:44

+0

它完美的作品,谢谢你的帮助T.J! – 2012-04-16 09:10:30

相关问题