I am creating a simple tetris game using Blazor WASM. The purpose of the following code is to render a grid of pixels as a game board and send a ROW and COL values as parameters to a function in a onclick event to log which “pixel” has been clicked.
Can someone explain me why this code does not work: (it sends the same (last) value of row and col when clicking on any “pixel”)
<div class="board">
@for (int row = 0; row < _height; row++)
{
for (int col = 0; col < _width; col++)
{
<div class="pixel" data-row="@row" data-col="@col" @onclick="@(() =>
LogClickedPixel($"Clicked pixel {row} - {col}"))"></div>
}
}
</div>
While this code works? (sends the row and col of the clicked “pixel”)
<div class="board">
@for (int row = 0; row < _height; row++)
{
for (int col = 0; col < _width; col++)
{
//assignement to a new variable is required
int _row = row;
int _col = col;
<div class="pixel" data-row="@row" data-col="@col" @onclick="@(() =>
LogClickedPixel($"Clicked pixel {_row} - {_col}"))"></div>
}
}
</div>
I want to understand why Blazor needs the variables to be reassigned to new ones. Arent they also temporary living in a scope of the single for loop iteration?
I want to understand why the reassignment is required for Blazor