【发布时间】:2022-01-02 11:38:55
【问题描述】:
我有一个带有以下 DIV 标记的 Blazor 服务器应用
<div class=mainScreen id="outerBox" style="width:@(TotalWidth)px;height:@(TotalHeight)px;">
foreach(Device thisDevice in MyDevices)
{
<div class=column id="@MainDiv" style="width:@(thisDevice.Width)px;height:@(thisDevice.Height)px;left:@thisDevice.XCoordinate;top:@thisDevice.YCoordinate">
Main Content Here...
</div>
}
</div>
我尝试使用此页面中的代码示例 - https://blazor.tips/blazor-how-to-ready-window-dimensions/ 设置高度、宽度和 X/Y 坐标,但无论我将 Try... 块放置在何处,它都无法正常工作,只会引发未捕获的异常。
然后我转向更直接的 JS 调用:
await Task.Run(async () =>
{
//Commenting out the OnInitializeAsync makes no difference but needs to be commented out when embedded
//On the main component
await this.OnInitializedAsync();
string data = await JSRuntime.InvokeAsync<string>("getMyWindow", new object[] { });
JObject offsets = (JObject)JsonConvert.DeserializeObject(data);
TotalHeight = offsets.Value<int>("height");
TotalHeight = offsets.Value<int>("width");
}
//In my JS file, the function looks as follows:
function getMyWindow() {
var obj = {};
obj.width = window.width;
obj.height = window.height;
return JSON.stringify(obj);
}
如果我直接在代码中进行此调用,则不会发生任何事情 - 即使注释掉了 OnInitializeAsync。
var result = SetDimensions().Result;
如果我将此方法放在 OnAfterRendor 方法中:
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
if (!SetTheDivs)
SetTheDivs = SetDimensions().Result;
StateHasChanged();
}
}
protected override void OnInitialized()
{
base.OnInitialized();
this.OnAfterRender(true);
}
在我终止该项目之前,一切都会挂起。从来没有任何错误,但是当我在高度或宽度语句上放置断点时,代码永远不会运行。
我什至在异步版本中添加了无济于事:
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
await SetDimensions();
StateHasChanged();
}
}
protected override async Task OnInitializedAsync()
{
await this.OnAfterRenderAsync(true);
}
与所有挂起的结果相同。我完全不知道如何进行,我真的需要一些帮助!
为了清楚起见,导致挂起的是对 JS 的调用:
string data = await JSRuntime.InvokeAsync<string>("getMyWindow", new object[] { });
我添加了一些警报,但它们从未运行:
function getMyWindow() {
var obj = {};
alert("hi");
obj.width = screen.width;
obj.height = screen.height;
alert("ho");
return JSON.stringify(obj);
}
感谢您的宝贵时间!
顺便说一句 - 我确实将双重等待更改为 string data = JSRuntime.InvokeAsync<string>("getMyWindow", new object[] { }).Result;
更新:我将 JS 调用完全移到了等待之外,我得到了错误:
InvalidOperationException:此时无法发出 JavaScript 互操作调用。这是因为组件是静态渲染的。启用预渲染后,JavaScript 互操作调用只能在 OnAfterRenderAsync 生命周期方法期间执行。
在这种情况下,我实际上是从 OnAfterRenderAsync 方法调用该方法:
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnInitializedAsync();
if (firstRender)
{
await SetDimensions();
StateHasChanged();
}
}
【问题讨论】:
标签: javascript c# razor blazor