我的页面加载后,我多次调用以下函数。目的是从服务器逐步加载许多类似格式的公司。对于每个公司,我希望找到所有x-editable
元素并绑定success
处理函数。在每种情况下,成功处理程序应该调用刷新函数,传递该特定公司的名称和ID。
这或多或少都有效 - 公司以递增方式加载,我能够找到匹配的x-editable
并将success
函数绑定到它们。
问题在于,当页面完全加载并且我使用x-editable
编辑某些数据时,refreshCompany()
函数已执行,但错误company_name
和company_guid
。 Refresh. . .
控制台消息中显示的名称和ID对于容器中的所有公司都是相同的,并且始终是公司列表中的 last ,而不是{{1>}中出现的名称和ID 1}}控制台消息。
我相信可能会发生以下两件事之一:
由于我不完全理解的闭包规则,Load. . .
和company_name
值仍然与外部作用域中的当前(ish)值绑定。
company_guid
搜索不是在我新创建的公司特定对象上运行,而是在包含所有公司的容器上运行(我的原始实现使用了.find('.editable')
而不是.append()
并且肯定遭受了从这个问题)。如何修改以下代码,以便在绑定函数时使用name和id值执行.appendTo()
?
refreshCompany()
答案 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语句。如果这有帮助,请告诉我。