在lazor的foreach循环中使用事件回调

发布于 2025-02-06 20:26:58 字数 2104 浏览 1 评论 0 原文

我不知道这是否是一个错误,但我会得到意外的行为。我明白了,当我修改Microsoft Doc“ EventCallback”时=“ nofollow noreferrer”>示例。

共享/child.razor:

”在此处输入图像描述“

<h3>child</h3>
<p>
    @{
        object obj = new();
    }
    @foreach(var item in DataSource)
    {
        obj = item;
        <button @onclick="() => OnClickCallback(obj)">
            @item
        </button>
    }
</p>

@code {
public List<string> DataSource = new List<string>{"cow", "dog", "pig", "rat"};

[Parameter]
public string Title { get; set; }

[Parameter]
public RenderFragment ChildContent { get; set; }

[Parameter]
public Func<object, Task> OnClickCallback { get; set; } = DoNothingAsync;

private static async Task DoNothingAsync(object param)
{
    await Task.CompletedTask;
}

}

shared/parent.razor.razor

    @page "/"
@inject IJSRuntime JS

<PageTitle>Index</PageTitle>

<h1>Hello, world!</h1>

Welcome to your new app.

<SurveyPrompt Title="How is Blazor working for you?" />

<Child @ref="Child">
    Bla bla bla
</Child>


@code{
    private string message;
    private Child Child;
        
        

protected async override Task OnAfterRenderAsync(bool firstRender)
{
     Child.OnClickCallback = ShowMessage;
}

private async Task ShowMessage(object str)
{
    await JS.InvokeVoidAsync("alert", (string)str);
}
}

u71mp.png“ rel =” nofollow noreferrer“> :我得到了带有不同标签的按钮列表,并具有以下标签=&gt; “牛”,“狗”,“猪”,“老鼠”。当我单击任何按钮时,我应该获得一个弹出警报,以显示我单击的按钮的标签文本。

实际结果:我获得了带有不同标签的按钮列表=&gt; “牛”,“狗”,“猪”,“老鼠”。但是,当我单击按钮时,无论我要单击哪种按钮,我都会获得一个弹出警报,显示“鼠”。

我不知道,这是一个错误吗?如果不是错误,我该如何获得预期的结果?

I don't know if this is a bug, but I'm getting an unexpected behaviour. I get it, when I modify microsoft doc "EventCallback" example.

Shared/Child.razor:

enter image description here

<h3>child</h3>
<p>
    @{
        object obj = new();
    }
    @foreach(var item in DataSource)
    {
        obj = item;
        <button @onclick="() => OnClickCallback(obj)">
            @item
        </button>
    }
</p>

@code {
public List<string> DataSource = new List<string>{"cow", "dog", "pig", "rat"};

[Parameter]
public string Title { get; set; }

[Parameter]
public RenderFragment ChildContent { get; set; }

[Parameter]
public Func<object, Task> OnClickCallback { get; set; } = DoNothingAsync;

private static async Task DoNothingAsync(object param)
{
    await Task.CompletedTask;
}

}

Shared/Parent.razor:

enter image description here

    @page "/"
@inject IJSRuntime JS

<PageTitle>Index</PageTitle>

<h1>Hello, world!</h1>

Welcome to your new app.

<SurveyPrompt Title="How is Blazor working for you?" />

<Child @ref="Child">
    Bla bla bla
</Child>


@code{
    private string message;
    private Child Child;
        
        

protected async override Task OnAfterRenderAsync(bool firstRender)
{
     Child.OnClickCallback = ShowMessage;
}

private async Task ShowMessage(object str)
{
    await JS.InvokeVoidAsync("alert", (string)str);
}
}

Expected Result: I get a list of buttons with different labels with the following Labels => "cow", "dog", "pig", "rat". And when I click on any of the button, I should get a pop-up alert displaying the label text of the button I clicked.

Actual Result: I get a list of buttons with different labels with the following Labels => "cow", "dog", "pig", "rat". But when I click on the button, I get a pop-up alert displaying "rat" regardless of whatever button I'm clicking.

I don't know, is this a bug? If it is not a bug, how do I get my expected result?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烟若柳尘 2025-02-13 20:26:58

这是由于LAMDA表达的可变范围而发生的。

更改

@inject IJSRuntime JS;

@for (var i = 0; i < DataSource.Count; i++)
{
    var local_i = i;
    var local_v = @DataSource[local_i];
    <div>
       <button 
       @onclick="() => OnClickCallback(local_v)">@DataSource[i]
       </button>
    </div>
}

更改CodeBehind的

@code {

public List<string> DataSource = new List<string>{"cow", "dog", "pig", "rat"};

   private async Task OnClickCallback(string s)
   {
   Console.WriteLine(s);
   await JS.InvokeVoidAsync("alert", s);  
   }

 }

证明这里

有了这样的书面。请参阅 在这里

@{ int x = 0;}
@foreach (var data in DataSource)
{
    var local_v = @DataSource[x];
    <div><button
          @onclick="() => OnClickCallback(local_v)">@data</button></div>
    x++;
}

This is happening due to variable scoping in lamda expression.

Change

@inject IJSRuntime JS;

@for (var i = 0; i < DataSource.Count; i++)
{
    var local_i = i;
    var local_v = @DataSource[local_i];
    <div>
       <button 
       @onclick="() => OnClickCallback(local_v)">@DataSource[i]
       </button>
    </div>
}

In codebehind

@code {

public List<string> DataSource = new List<string>{"cow", "dog", "pig", "rat"};

   private async Task OnClickCallback(string s)
   {
   Console.WriteLine(s);
   await JS.InvokeVoidAsync("alert", s);  
   }

 }

Proof here

With foreach it can be written like this. See here.

@{ int x = 0;}
@foreach (var data in DataSource)
{
    var local_v = @DataSource[x];
    <div><button
          @onclick="() => OnClickCallback(local_v)">@data</button></div>
    x++;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文