Как получить параметр, чтобы он не только отображался в компоненте, но и распознавался внутри OnInitializedAsyn c ()? - PullRequest
0 голосов
/ 28 апреля 2020

Я работаю над проектом на стороне сервера Blazor, и у меня есть компонент, которому передают модель (selectedWeek) в качестве параметра. Я могу использовать модель точно в линию с html, но OnInitializedAsyn c всегда считает, что модель является нулевой.

Я передал нативные типы в качестве параметров из Страницы в компонент, таким образом, без проблем. Я использую NullWeek в качестве параметра по умолчанию, поэтому число, используемое в OnInitializedAsyn c, кажется, только из NullWeek. В случае, если это связано, есть компонент-брат, который возвращает модель Week на страницу через вызов .InvokeAsyn c, где StateHasChanged () вызывается после обновления. Похоже, что новая неделя обновляется для проблемного компонента, но OnInitializeAsyn c () либо не видит его, либо просто никогда не запускается снова, что, возможно, является моей проблемой, но я не думал, что это сработало. way.

Например, приведенный ниже код всегда будет отображать «FAILURE», но будет отображать правильный Week.Number. Код ниже:

<div>@pickedWeek.Number</div>
@if(dataFromService != null)
{
    <div>SUCCESS</div>
}
else
{
    <div>FAILURE</div>
}

@code{
    [Parameter]
    public Week pickedWeek { get; set; }
    protected IEnumerable<AnotherModel> dataFromService { get; set; }

    protected override async Task OnInitializedAsync()
    {
        if (pickedWeek.Number > 0)
        {
             dataFromService = await _injectedService.MakeACall(pickedWeek.Id);
        }
    }
}

1 Ответ

1 голос
/ 28 апреля 2020

@ robsta имеет это исправление в комментариях, вы можете использовать OnParametersSet для этого. Затем вы столкнетесь с другой проблемой, в которой каждый повторный запрос будет снова устанавливать ваши параметры и генерировать еще один вызов вашей службе. Я справился с этим, используя поле флага вместе с методом OnParametersSet. Дайте этому шанс и доложите.

private bool firstRender = true;

protected override async Task OnParametersSetAsync()
{
    if (pickedWeek.Number > 0 && firstRender)
    {
        dataFromService = await _injectedService.MakeACall(pickedWeek.Id);
        firstRender = false;

        // MAYBE call this if it doesn't work without
        StateHasChanged();
    }
}

Другой альтернативой является использование переопределения OnAfterRender, которое обеспечивает firstRender bool в сигнатуре метода, и вы можете сделать аналогичную логику c. Я предпочитаю первый способ, хотя, так как этот второй способ позволяет его визуализировать, THEN устанавливает значение вашего списка, THEN вызывает еще один повторный рендеринг, который кажется мне больше болтовней, чем мне нужно. Однако, если ваша задача долго выполняется, используйте эту вторую версию и создайте загрузочное сообщение, которое будет отображаться, пока список пуст, и другое, которое будет отображаться, если вызов службы завершится неудачно. «НЕИСПРАВНОСТЬ» немного вводит в заблуждение, поскольку она отображается до завершения вызова.

Я также обнаружил, что вызов на номер await Task.Delay(1);, размещенный до вызова службы, может быть полезен, поскольку он прерывается. поток пользовательского интерфейса освобождается от ожидающего вызова службы и позволяет вашему приложению отображаться в состоянии загрузки, пока данные не вернутся.

...