在 for 循环中使用 @ref 来获取元素引用

LOL*_*vem 6 javascript c# .net-core blazor

我试图在不同的地方获得相同对象的位置,其中,使用 javascript 函数,我应该获得不同的顶部位置,但这不是场景。脚本代码:

<script type="text/javascript">
    window.ShowAlert = function myFunction(element) {   
    console.log("Hello World.");
    alert(element.offsetTop);
   }
</script>
Run Code Online (Sandbox Code Playgroud)

Index.razor 代码:

@inject IJSRuntime jsRuntime

<div>
    @for (int i = 0; i < 10; i++)
    {
        <div @onclick="MemberFunction" @ref="memberRef">Click Here</div>
    }

</div>

@code {

    private ElementReference memberRef;
    void MemberFunction()
    {
        jsRuntime.InvokeAsync<object>("ShowAlert", memberRef);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如你在这里看到的,我for在同一个 div 中做一个,他在那里下线。我想从中得到的是,对于每个div发布的内容,它都应该给我不同的值offsetTop,因为他一个接一个地往下走。我该如何处理这个问题?

为了更好地理解这里,您有一个演示https://blazorfiddle.com/s/4g57o82k。正如您在演示中看到的,每个Click Here的值是相同的。

感谢您的关注。

Ven*_*sky 14

编辑:

我认为这是一个错误,所以我创建了一个问题。如果这不是问题或得到解决,我会在这里更新。

查看有关 lambda 表达式的文档

不要直接在 lambda 表达式中的循环i中使用循环变量 ( ) 。for否则,所有 lambda 表达式都使用相同的变量,导致i所有 lambda 中的 值相同。始终在局部变量中捕获其值(buttonNumber在前面的示例中),然后使用它。

因此,查看问题和给出的答案,我稍微调整一下并设法使其发挥作用。

您需要在 中定义一个新变量for来保存 的值i

@inject IJSRuntime jsRuntime

<div>
    @for(var i = 0; i < memberRef.Count(); i++)
    {
        var i2 = i;
        <div @onclick="() => MemberFunction(i2)" @ref="memberRef[i2]">Click Here</div>
    }
</div>

@code {

    private ElementReference[] memberRef { get; set; } = new ElementReference[11];
    void MemberFunction(int i)
    {
        jsRuntime.InvokeAsync<object>("ShowAlert", memberRef[i]);
    }

}
Run Code Online (Sandbox Code Playgroud)

这是一个工作小提琴