【问题标题】:Blazor Webassembly - Why does function get called on TimerOnElapsed?Blazor Webassembly - 为什么在 TimerOnElapsed 上调用函数?
【发布时间】:2021-12-22 15:12:16
【问题描述】:

我正在使用 Blazor Webassembly 模板,特别是天气预报页面。

我只是添加了一个计时器并有一个增加变量的函数,该函数显示在页面上。我没有得到的是, addText 函数从未被专门调用,但变量随着计时器的经过而不断增加。所以我不明白这里发生了什么。

有人可以启发我吗? html 区域内的所有函数都在 StateHasChanged() 上调用吗?如果我将 html 中的行更改为 '@((MarkupString)sometext.ToString())',它不会增加。代码如下:

<h1>Weather forecast</h1>

<p>This component demonstrates fetching data from the server.</p>

@if (forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th>Date</th>
                <th>Temp. (C)</th>
                <th>Temp. (F)</th>
                <th>Summary</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var forecast in forecasts)
            {
                <tr>
                    <td>@forecast.Date.ToShortDateString()</td>
                    <td>@forecast.TemperatureC</td>
                    <td>@forecast.TemperatureF</td>
                    <td>@forecast.Summary</td>
                </tr>
            }
        </tbody>
    </table>
    <br />

    @((MarkupString)addText())
}

@code {
    private WeatherForecast[] forecasts;

    private int sometext = 0;
    Timer timer;

    protected override async Task OnInitializedAsync()
    {
        timer = new Timer();
        timer.Interval = 1000;
        timer.Elapsed += TimerOnElapsed;

        timer.Start();

        forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast");
    }

    private void TimerOnElapsed(object sender, ElapsedEventArgs e)
    {
        StateHasChanged();
    }

    private string addText()
    {
        return sometext++.ToString();
    }
}

【问题讨论】:

    标签: timer blazor webassembly


    【解决方案1】:

    StateHaseChanged 正在强制渲染。渲染正在调用函数...标记区域被编译为渲染时调用的委托。您的函数只是一个子程序调用。您正在计算渲染调用。

    <h1>Weather forecast</h1>
    
    <p>This component demonstrates fetching data from the server.</p>
    
    @if (forecasts == null)
    {
        <p><em>Loading...</em></p>
    }
    else
    {
        <table class="table">
            <thead>
                <tr>
                    <th>Date</th>
                    <th>Temp. (C)</th>
                    <th>Temp. (F)</th>
                    <th>Summary</th>
                </tr>
            </thead>
            <tbody>
                @foreach (var forecast in forecasts)
                {
                    <tr>
                        <td>@forecast.Date.ToShortDateString()</td>
                        <td>@forecast.TemperatureC</td>
                        <td>@forecast.TemperatureF</td>
                        <td>@forecast.Summary</td>
                    </tr>
                }
            </tbody>
        </table>
        <br />
    
        @sometext 
    }
    
    @code {
        private WeatherForecast[] forecasts;
    
        private int sometext = 0;
        Timer timer;
    
        protected override async Task OnInitializedAsync()
        {
            timer = new Timer();
            timer.Interval = 1000;
            timer.Elapsed += TimerOnElapsed;
    
            timer.Start();
    
            forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast");
        }
    
        private void TimerOnElapsed(object sender, ElapsedEventArgs e)
        {
            sometext++;
            StateHasChanged(); // <- probably not needed not sure
        }   
    }
    

    【讨论】:

    • 有没有办法通过计时器更新一个递增的变量,正在打印,没有渲染/状态改变?我不想更新其他所有内容,只是递增变量
    • @E.D.如果您将@sometext 渲染为函数正在更新的字段......
    • 很难解释我遇到的真正问题,但它更复杂。涉及更多功能等,但我现在有了更好的理解并且已经解决了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-08-30
    • 2021-07-15
    • 1970-01-01
    • 2020-10-09
    • 2020-10-05
    • 2021-02-01
    • 2021-07-27
    • 2020-09-15
    相关资源
    最近更新 更多