成功函数绑定到x-editable,不使用正确的参数执行

时间:2015-04-06 15:20:02

标签: javascript jquery closures x-editable

我的页面加载后,我多次调用以下函数。目的是从服务器逐步加载许多类似格式的公司。对于每个公司,我希望找到所有x-editable元素并绑定success处理函数。在每种情况下,成功处理程序应该调用刷新函数,传递该特定公司的名称和ID。

这或多或少都有效 - 公司以递增方式加载,我能够找到匹配的x-editable并将success函数绑定到它们。

问题在于,当页面完全加载并且我使用x-editable编辑某些数据时,refreshCompany()函数已执行,但错误company_namecompany_guidRefresh. . .控制台消息中显示的名称和ID对于容器中的所有公司都是相同的,并且始终是公司列表中的 last ,而不是{{1>}中出现的名称和ID 1}}控制台消息。

我相信可能会发生以下两件事之一:

  • 由于我不完全理解的闭包规则,Load. . .company_name值仍然与外部作用域中的当前(ish)值绑定。

    • 我的company_guid搜索不是在我新创建的公司特定对象上运行,而是在包含所有公司的容器上运行(我的原始实现使用了.find('.editable')而不是.append()并且肯定遭受了从这个问题)。

如何修改以下代码,以便在绑定函数时使用name和id值执行.appendTo()

refreshCompany()

1 个答案:

答案 0 :(得分:1)

我希望这会有所帮助,但似乎问题是,当您从异步GET请求获得响应时,您已经循环通过 列表中的所有公司,所以当成功方法运行时, company_name和company_guid绑定到列表中的最后一个公司。

我认为你应该能够用一个闭包来解决这个问题。也许就像在loadCompanies之外定义一个函数一样:

function refreshClosure(companyName, companyGuid) {
	return function () {
		console.log('Refresh ' + companyName + ' ' + companyGuid)
		refreshCompany(companyName, companyGuid);
	}
}

...并在你的代码中使用它:

function loadCompanies(company_list, container_name, link_container_name) {

    var searchTerm = '#' + container_name;

    for (var company in company_list)
    {

        var company_name = company.name;
        var company_guid = company.id;
      
        // Enclose the current value of company_name and company_guid
        var refreshCurrent = refreshClosure(company_name, company_guid);
        
      console.log('Load ' + company_name + ' ' + company_guid);

        $.ajax(
            {
                url : '${fund.name}/' + encodeURIComponent( company_name ),
                type : 'GET'
            }
        ).done (
            function (company_html) {
                var newElement = $(company_html).appendTo('#' + container_name);
                newElement.find('.editable').editable(
                    {
                        success : function (response, newValue) {
                        // Invoke the function returned from the closure
                            refreshCurrent();
                        }
                    }
                );
            }
        );

    }
}

如果是问题的一部分,我也更改了for语句。如果这有帮助,请告诉我。