【发布时间】:2020-11-18 16:11:44
【问题描述】:
我在 blazor 中有一个列表组件,它有一个可折叠的创建部分,我希望当您单击以显示创建部分时它将显示并滚动到创建部分。 我的问题是 StateHasChanged() 没有及时更新 UI,所以当 javascript 触发时,我们试图滚动到的元素还不存在。
显然我可以通过超时来解决这个问题,但是在 Blazor 中执行此操作的更简洁的方法是什么?有没有办法说类似await StateUpdated()....
我的代码如下所示:
@page "/createlist"
<div>
<h3>My List</h3>
<a @onclick="ToggleAdding">
Create New
</a>
</div>
<ul>
@* list existing items... *@
</ul>
@if (IsAdding)
{
<div id="some-create-id">
<h3>Add Section</h3>
@* create controls here *@
</div>
}
@code {
public void ToggleAdding()
{
IsAdding = !IsAdding;
// Need something similar to StateHasChanged(), that is awaitable.
JsRuntime.InvokeVoidAsync("ScrollIn", new object[] { CreateElementId });
}
}
而js很简单:
ScrollIn = id => {
let element = document.getElementById(id);
console.log(!!element ? "SCROLLIN" : "NO FOUND ELE", id);
if (!!element) { element.scrollIntoView(); }
}
【问题讨论】:
-
我在使用 scrollIntoView 的 UL/LI 方面有完全相同的体验,唯一的区别是我正在调用 Web 服务来显示要显示的项目。这对我来说似乎是框架中的一个错误,因为我什至尝试像这样链接异步任务:await Task.Run(UpdateMessages).ContinueWith(antecedent => ScrollIntoView());让它滚动的唯一方法是将 Task.Delay(500) 添加到 ScrollIntoView 方法。
标签: c# .net blazor blazor-server-side