首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的带ElementReference和IJSRuntime.InvokeAsync的blazor组件在for循环中不能工作

为什么我的带ElementReference和IJSRuntime.InvokeAsync的blazor组件在for循环中不能工作
EN

Stack Overflow用户
提问于 2020-11-04 01:27:24
回答 1查看 857关注 0票数 0

blazor (服务器)组件的标记中,我试图在循环中添加的每个元素上调用javascript函数。explain...hopefully有点困难--这段代码片段可以帮助您:

代码语言:javascript
复制
@page "/"
@inject IJSRuntime JS
@for(var i = 0; i < 3; i++)
{
    ElementReference div;
    <div @ref="div">this should get replaced....</div>
    JS.InvokeVoidAsync("Test", div, i); @* where Test is defined as: function Test(el, i) { el.innerHTML = i; }*@
}

如果我要这样做,错误的way...what是正确的方式吗?

关于更多的上下文,这就是我真正想要做的:

代码语言:javascript
复制
@page "/"
@inject IJSRuntime JS
@foreach(var data in jsonItems)
{
    ElementReference div;
    <div @ref="div"></div>
    JS.InvokeVoidAsync("JsonView.renderJSON", data, div); @* https://github.com/pgrabovets/json-view *@
}
@code
{
    private readonly IEnumerable<string> jsonItems = new List<string> {"{}", "{}"};
}

我创造了这个手鼓如果这有帮助的话..。https://blazorfiddle.com/s/428ov3ku

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-04 09:16:34

在为ElementReference对象分配元素引用之前,不能使用它。您的组件尚未创建和呈现,因此没有可用的ElementReference对象。只有在呈现组件之后才能使用ElementReference对象。

你可以这样做:

代码语言:javascript
复制
@inject IJSRuntime JSRuntime

@foreach (var div in divs)
{
  
    <div @ref="div.ElementReference"></div>
  
}
@code
{
    private readonly IEnumerable<Div> divs = new List<Div> { new Div{JSON="{1}" },
                                                             new Div{JSON="{2}"},
                                                             new Div{JSON="{3}"}};

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {

        if (firstRender)
        {
            @foreach (var div in divs)
            {
            await JSRuntime.InvokeVoidAsync(
               "exampleJsFunctions.jsonRenderer", div.JSON, div.ElementReference);
            
            }
     
        }
    }

    public class Div
    {
        public ElementReference ElementReference { get; set; }
        public string JSON { get; set; } 

    }

 }

将脚本放在_Host.cshtml文件的底部.

代码语言:javascript
复制
 <script>
        window.exampleJsFunctions = {
            jsonRenderer: function (json, element) {
                element.innerText = json;
            }
        }
    </script>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64673089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档