Я был здесь раньше. Вот 2 дня, когда вы можете решить эту проблему.
Cleanest Way
Используйте .forEach
вместо for
l oop. Как это:
embededTiles.forEach( function(tileEmbed, i){
tileEmbed.off("tileLoaded");
tileEmbed.on("tileLoaded", function (event) {
console.log("tile " + i + " loaded");
});
tileEmbed.off("tileClicked");
tileEmbed.on("tileClicked", function (event) {
console.log(event);
location.href = "/powerbi/report?reportId=" + event.detail.openReport.reportId;
});
})
Пересмотр того, что вы пытались использовать замыкание
Проблема в том, что ваш l oop проходит через все i
до обработчик событий сработал. Таким образом, к тому времени, когда плитка embedded
запускает событие tileLoaded
или tileClicked
, ваш l oop уже работает до тех пор, пока i
не станет значением длины вашего массива. Вот почему работает только последний. Чтобы это исправить, вам нужно замыкание . Например:
for (let i = 0; i < embededTiles.length; i++) {
((j) => {
var tileEmbed = embededTiles[j];
tileEmbed.off("tileLoaded");
tileEmbed.on("tileLoaded", function (event) {
console.log("tile " + j + " loaded");
});
tileEmbed.off("tileClicked");
tileEmbed.on("tileClicked", function (event) {
console.log(event);
location.href = "/powerbi/report?reportId=" + event.detail.openReport.reportId;
});
})(i)
}
Это создаст немедленно вызванное функциональное выражение внутри вашего l oop с новой индексной переменной j
. Для каждой итерации ваших циклов запускается j
со значением i
для этой итерации. Но значение i
в этот момент закрывается и сохраняется в вашем обработчике событий для каждой итерации. Теперь у каждого элемента вашего массива есть собственный обработчик событий, связанный с его индексом в массиве.