【问题标题】:Blazor Server, Conditional Elements + JS InvokingBlazor 服务器,条件元素 + JS 调用
【发布时间】:2020-05-18 17:30:39
【问题描述】:

我有一个 Blazor Server 应用程序,它是一个多步骤“向导”表单。在每个相关步骤之后,都会调整状态,并通过条件语句显示/隐藏新的 HTML(下面的简单示例)。

if (IsStepSignature)
{
    <div>Signature HTML here</div>
}

这一切都很好。当我需要在上面动态生成的 HTML 上调用一些 JS 逻辑时(例如,单击处理程序以连接外部 JS 库),我的问题就出现了。当我处理“下一步”点击时,我可以很好地调用 JS……但它还没有从上面看到动态 HTML。有没有办法调用一些 JS,并对其进行控制,使其直到页面从 C# 代码执行重绘后才执行?

2020 年 5 月 18 日来自 Nik P 的更新 可以利用一些标志并使用OnAfterRenderAsync 来控制此排序。这确实有效,但它确实需要一些额外的往返服务器的跃点。以下是我在实施时看到的。这可能只是 Blazor Server 的特性,因为优点/缺点之一是一些已知的额外的健谈。这些请求总共有 2.5K,非常小。

CLIENT    -->    Browser Dispatch Event (NEXT CLICK)
Render    <--    SERVER
CLIENT    -->    Render Complete
Invoke JS <--    SERVER
CLIENT    -->    Invoke Complete

【问题讨论】:

    标签: asp.net-core blazor blazor-server-side


    【解决方案1】:

    在重新渲染发生之前,您遇到的问题与客户端 HTML 中根本不存在的元素有关。因此,一种方法是在 C# 代码中设置一个布尔标志,表示在渲染后需要运行代码,并填充 JS 互操作所需的支持字段。每当您需要运行 JS 互操作时,请将您的标志设置为 true,将您的支持字段设置为 JS 互操作调用所需的值,然后执行一些启动 DOM 差异计算的操作。 (即使 StateHasChanged 也应该足够了,但是按照您提到的有条件地添加您的项目也可以)然后,按如下方式覆盖您的 OnAfterRenderAsync 方法:

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if(firstRender)
        {
            // any first render code
        }
    
        if(yourFlag)
        {
            YourJSInteropMethod(supportField1, supportfield2);
            yourflag = false;  
        }
    }
    

    这种方法的简单之处在于 DOM 更新总是发生在 OnAfterRenderAsync 调用之前,因此您的 HTML 将填充您使用 JS 定位的内容。

    【讨论】:

    • 感谢您的洞察力。如果我正确理解了这个想法,那么在 JS 触发之前,这将需要 2 跳到服务器(在 Blazor 服务器中),对吧? #1 点击下一步,它设置一个标志来显示新的 HTML 元素。 #2是支持字段调整导致重新渲染...然后调用JS?
    • 不完全。当您单击下一步时,在同一呼叫中设置您的支持字段和标记,接近呼叫结束时,然后更改您的条件以移至下一个屏幕。到那时您应该拥有所有数据,因此它已就位并准备好在 DOM 更新后继续使用。那是一跳。重新渲染后,JS 调用会再产生一跳,至少我认为,但实际的 JS 应该已经与初始页面加载一起发货,所以服务器所做的只是调用并且 JS 应该运行客户端一边。
    • 我在原始问题上添加了一些网络流量详细信息,因为它需要一些额外的标记才能使其可读。这确实有效,但似乎确实需要 2.5 个网络跃点。也许这是使用 blazer Server 执行此操作的“正常”方式 - 似乎它可能是......我的第一次尝试是在 setTimeout 中抛出 JS 初始化,这也有效但让我感到难过:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多