Javascript 迭代Algolia命中将用最后一个结果的ID覆盖每个ID
我有一个包含如下数据的Algolia索引:Javascript 迭代Algolia命中将用最后一个结果的ID覆盖每个ID,javascript,algolia,Javascript,Algolia,我有一个包含如下数据的Algolia索引: id:FirstLastNumber name:First Name objectID:FirstLastNumber address:1234 Fake Street city:New York state:NY algoliaIndex.search({ query: input }, function searchDone(error, content) { if (error) {
id:FirstLastNumber
name:First Name
objectID:FirstLastNumber
address:1234 Fake Street
city:New York
state:NY
algoliaIndex.search({
query: input
}, function searchDone(error, content) {
if (error) {
console.log(error);
return;
}
var results = document.getElementById('results');
for (var hit in content.hits) {
var resultName = content.hits[hit].name;
var resultCity = content.hits[hit].city;
var resultID = content.hits[hit].id
var resultItem = document.createElement('a');
resultItem.className = "collection-item";
resultItem.innerHTML = "<div class='list-text'><span
class='title-in-list'>" + resultName + "</span><br><span
class='date-in-list'>" + resultCity + "</span></div>";
resultItem.onclick = function() {
//pull details for the member.
getMember(resultID);
};
results.appendChild(resultItem);
};
});
我查询并将结果转储到如下页面:
id:FirstLastNumber
name:First Name
objectID:FirstLastNumber
address:1234 Fake Street
city:New York
state:NY
algoliaIndex.search({
query: input
}, function searchDone(error, content) {
if (error) {
console.log(error);
return;
}
var results = document.getElementById('results');
for (var hit in content.hits) {
var resultName = content.hits[hit].name;
var resultCity = content.hits[hit].city;
var resultID = content.hits[hit].id
var resultItem = document.createElement('a');
resultItem.className = "collection-item";
resultItem.innerHTML = "<div class='list-text'><span
class='title-in-list'>" + resultName + "</span><br><span
class='date-in-list'>" + resultCity + "</span></div>";
resultItem.onclick = function() {
//pull details for the member.
getMember(resultID);
};
results.appendChild(resultItem);
};
});
如何获取从Algolia返回的id或objectID以粘贴到相应的项?问题在于javascript作用域的工作方式。即使看起来您在每个键迭代中都创建了一个具有不同的
resultId
的函数,但实际上并非如此。由于resultId
是由外部hit
变量确定的,并且在每个循环中hit
都会被覆盖,因此您最终会对同一hit
变量有多个引用,因此您总是会看到循环中设置为hit
的最后一个ID的返回值
一种解决方案是将onClick函数声明包装在函数中,以便在每次迭代时在distincthit
值上创建闭包。也许这会奏效:
setHandler = function(id) {
return function() {getMember(id)};
};
resultItem.onClick = setHandler(resultID)
问题在于javascript作用域的工作方式。即使看起来您在每个键迭代中都创建了一个具有不同的
resultId
的函数,但实际上并非如此。由于resultId
是由外部hit
变量确定的,并且在每个循环中hit
都会被覆盖,因此您最终会对同一hit
变量有多个引用,因此您总是会看到循环中设置为hit
的最后一个ID的返回值
一种解决方案是将onClick函数声明包装在函数中,以便在每次迭代时在distincthit
值上创建闭包。也许这会奏效:
setHandler = function(id) {
return function() {getMember(id)};
};
resultItem.onClick = setHandler(resultID)
这是一个范围问题。在循环中,hit变量的作用域是全局的。您可以将for循环中的代码封装在一个闭包中,该闭包捕获循环中该点处的
hit
值,或者如果您同意使用ES6功能,可以使用let
代替var
选择1
:
选择2
这是一个范围问题。在循环中,hit变量的作用域是全局的。您可以将for循环中的代码封装在一个闭包中,该闭包捕获循环中该点处的
hit
值,或者如果您同意使用ES6功能,可以使用let
代替var
选择1
:
选择2
谢谢你们两位!我现在明白多了。谢谢你们!我现在明白多了。