Blazor,如何将事件目标传递给 JavaScript
Blazor, how to pass event target to JavaScript
我想问:
在 Blazor 中,如何将事件目标(或这个)传递给我的 JavaScript?
问题是我正在用 @foreach
创建输入,所以可以有很多输入。
这是它的样子:
@foreach (Item in ItemsList)
{
<input
@onchange="ChangeColor"
value="@Item.Value">
}
我想简单的onchange
触发这个函数:
@code
{
async Task ChangeColor()
{
await JsRuntime.InvokeVoidAsync("changeColor");
}
}
并最终读取我 JS 中的值:
function changeColor (el) {
console.log(el);
}
我尝试使用@ref,但我想访问触发函数的输入。由于可能有很多,我不想使用 @ref 对它们中的每一个进行硬编码。
如评论所述
@Vencovsky I hoped to get DOM elemenet
如果您想在控制台中显示 DOM 元素,您需要将 @ref
传递给 DOM 元素并将该引用传递给 javascript
但是你在问题中说
I tried using @ref, however I'd like to get access to the input that triggers the function. Since there may by many of them, I don't want to hardcode it using @ref to each of them.
所以这有点令人困惑,因为你需要使用 @ref
但你说你不想使用 @ref
,所以我认为正在发生的事情是你使用了 @ref
错误的方式,你认为你不需要它,但实际上你需要。
这是你需要的
- 一个 属性 来保存每个元素的所有引用 (
ElementReference
)
- 只传递给
ChangeColor
被点击的元素
这是一个关于如何做的例子
@for(var i = 0; i < ItemsList.Count(); i++)
{
var ii = i;
@* Passing only the ref that called @onchange *@
<input @onchange="(() => ChangeColor(Refs[ii]))"
@ref="Refs[ii]"
value="@ItemsList[ii]">
}
@code
{
[Inject]
IJSRuntime JSRuntime { get; set; }
async Task ChangeColor(ElementReference el)
{
await JSRuntime.InvokeVoidAsync("changeColor", el);
}
// Property that will hold the refs
ElementReference[] Refs { get; set; }
string[] ItemsList { get; set; } = new string[]
{
"hey",
"hope",
"this",
"works"
};
}
我想问:
在 Blazor 中,如何将事件目标(或这个)传递给我的 JavaScript?
问题是我正在用 @foreach
创建输入,所以可以有很多输入。
这是它的样子:
@foreach (Item in ItemsList)
{
<input
@onchange="ChangeColor"
value="@Item.Value">
}
我想简单的onchange
触发这个函数:
@code
{
async Task ChangeColor()
{
await JsRuntime.InvokeVoidAsync("changeColor");
}
}
并最终读取我 JS 中的值:
function changeColor (el) {
console.log(el);
}
我尝试使用@ref,但我想访问触发函数的输入。由于可能有很多,我不想使用 @ref 对它们中的每一个进行硬编码。
如评论所述
@Vencovsky I hoped to get DOM elemenet
如果您想在控制台中显示 DOM 元素,您需要将 @ref
传递给 DOM 元素并将该引用传递给 javascript
但是你在问题中说
I tried using @ref, however I'd like to get access to the input that triggers the function. Since there may by many of them, I don't want to hardcode it using @ref to each of them.
所以这有点令人困惑,因为你需要使用 @ref
但你说你不想使用 @ref
,所以我认为正在发生的事情是你使用了 @ref
错误的方式,你认为你不需要它,但实际上你需要。
这是你需要的
- 一个 属性 来保存每个元素的所有引用 (
ElementReference
) - 只传递给
ChangeColor
被点击的元素
这是一个关于如何做的例子
@for(var i = 0; i < ItemsList.Count(); i++)
{
var ii = i;
@* Passing only the ref that called @onchange *@
<input @onchange="(() => ChangeColor(Refs[ii]))"
@ref="Refs[ii]"
value="@ItemsList[ii]">
}
@code
{
[Inject]
IJSRuntime JSRuntime { get; set; }
async Task ChangeColor(ElementReference el)
{
await JSRuntime.InvokeVoidAsync("changeColor", el);
}
// Property that will hold the refs
ElementReference[] Refs { get; set; }
string[] ItemsList { get; set; } = new string[]
{
"hey",
"hope",
"this",
"works"
};
}