【问题标题】:How to pass an element to jQuery post inside a loop如何在循环内将元素传递给jQuery post
【发布时间】:2012-04-16 08:49:27
【问题描述】:

我有以下代码:

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 函数返回的数据的情况下传递元素的方法。

有没有办法解决这个问题,或者是否有替代的 jQuery 方法可以满足需要?

【问题讨论】:

    标签: javascript jquery post loops


    【解决方案1】:

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

    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 完成时调用该函数,并且可以访问$.post 提供的data 参数以及makeHandlerfield 参数,因为它是调用上下文的闭包到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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 2011-07-15
      • 2013-10-07
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多