یک نکتهی تکمیلی: نیاز به دقت در ویژگی «captured into the closure» در حلقههای Blazor
برای مثال حلقهی زیر را در نظر بگیرید:
@for( int c = 0; c < 10; c++ )
{
<li>
<a href="#" @onclick="@(_=> OnLinkClicked(c))">@c</a>
</li>
}
فکر میکنید پس از پایان این حلقه و رندر UI، اگر بر روی لینکی کلیک شد، چه مقداری به متد OnLinkClicked ارسال میشود؟
برخلاف تصور، با کلیک بر روی تمام لینکها، فقط عدد ثابت 10 به متد OnLinkClicked ارسال میشود. علت آن، همان نکات مطلب «
بررسی مفهوم Captured Variable در زبان سی شارپ» است که در حین تشکیل حلقههای Blazor هم صادق هستند.
برای رفع این مشکل، از یکی از دو روش زیر میتوان استفاده کرد:
Capture متغیر داخل حلقه:
@for( int c = 0; c < 10; c++ )
{
var current = c;
<li>
<a href="#" @onclick="@(_=> OnLinkClicked(current))">@current</a>
</li>
}
و یا ایجاد یک حلقهی foreach بر روی یک Enumerable: @foreach(var c in Enumerable.Range(0,10))
{
<li>
<a href="#" @onclick="@(_=> OnLinkClicked(c))">@c</a>
</li>
}