Внедрение пользовательского сервиса в иерархию компонентов

У меня есть одноэлементный сервис, который я передаю в качестве параметра в Index.razor. Index.razor перерисовывается, когда я очищаю счетчик. Когда я передаю ту же услугу компоненту 1 и нажимаю кнопку «Увеличить количество», страница не отображается повторно. Если я перезагрузлю страницу, я увижу увеличение счетчика.

Thank you for your assistance.

ПС. Я не могу правильно отформатировать класс MyService. Я пробовал несколько раз. Мои извинения. Я новичок в переполнении стека.

Услуга

namespace Injection.Pages

{ открытый класс MyService { общественный int Counter {получить; набор; } публичная недействительность увеличенияCount() { Счетчик = Счетчик + 1;

    }

    public void clearCounter()
    {
        Counter = 0;
    }

}

}

Индекс
@страница "/" @inject MyService myService

<h3>Injection</h3>

<button @onclick = "clearCounter">Clear Count</button>
<br />
<br />

@myService.Counter

<Component1 myService = "myService" />

@code
{
    private void clearCounter ()
    {
        myService.clearCounter();
        StateHasChanged();
    }
}

Компонент

    <h3>Component1</h3>

<button @onclick = "increaseCount">Increase Count</button>

@code {
    [Parameter]
    public MyService myService { get; set; }

    private void increaseCount()
    {
        myService.increaseCount();
        StateHasChanged();
    }
}

Делайте инъекции везде, где вам это нужно, и только там. _Imports предназначен для @include и не имеет wrap других компонентов.

Henk Holterman 14.08.2024 16:17

Спасибо за ваш ответ, Хенк. Когда я вводил непосредственно в компонент ContactForm и компонент ContactList, я получаю исходную ошибку. Счетчик увеличивается, но компонент ContactList не обновляется.

Picard78 14.08.2024 16:36

Инъекция – это не уведомление. Вам необходимо реализовать какой-то механизм уведомлений для вызова StateHasChanged() в компонентах прослушивания. Поиск INotifyPropertyChanged C# — это один из способов.

Brian Parker 14.08.2024 18:22

Я включил StateHasChanged() в AddContact(). Состояние меняется, поскольку обновляется счетчик на странице, но не подкомпонент ContactList. Спасибо

Picard78 14.08.2024 18:57

Как уже упоминалось, внедрение в _imports делает сервис глобально доступным в этой папке, но не уведомляет об изменении состояния. Передача параметра приводит к повторному рендерингу страницы. Вот пример github.com/claudiobernasconi/BlazorParametersAndState/tree/m‌​ain/… Более того, я немного смущен pass it as a parameter ... which resolved the issue. Поскольку вы решили, вы должны были заметить правильные шаги и сосредоточиться на том, как понять логику рендеринга. Не могли бы вы объяснить, что вы подразумеваете под своими попытками и ошибками в комментариях?

Fengzhi Zhou 15.08.2024 09:21

Спасибо за ваш ответ, Фэнчжи. «Передача параметра приводит к повторному рендерингу страницы». Да, это правильно, когда я передаю Службу в качестве параметра в ContactList (второй в иерархии). Однако когда я передаю параметр из ContactList в компонент Contact (3d в иерархии), страница не перерисовывается. Этот дополнительный второй уровень передачи параметров не приводит к повторной визуализации страницы. Обратите внимание, что я использую StateHasChanged(), и он не выполняет повторный рендеринг.

Picard78 15.08.2024 13:54

@ Picard78 - тебе нужно показать какой-то реальный код или создать минимальный воспроизводимый пример. На данный момент представление кода, который у вас есть, — это чистая догадка. Такие утверждения, как «Обратите внимание, что я использую StateHasChanged(), и он не выполняет повторную визуализацию», ничего не значат, если вы не знаете, где и как вы его вызываете.

MrC aka Shaun Curtis 15.08.2024 17:01

Понял. Я создам минимальный воспроизводимый пример.

Picard78 15.08.2024 20:24

Я привел минимальный пример кода. Пожалуйста, дайте мне знать, если этого достаточно. Прошу прощения за форматирование класса MyServices. Я несколько раз пытался исправить форматирование, но безуспешно. Спасибо.

Picard78 16.08.2024 00:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Таким образом, несмотря на то, что вы установили состояние, об изменении между компонентами не сообщается. Вот образец.

Услуга

public class MyService
{
    public int Counter { get; set; }
    public Action OnChange { get; set; }

    public void increaseCount()
    {
        Counter += 1;
        NotifyStateChanged();
    }

    public void clearCounter()
    {
        Counter = 0;
        NotifyStateChanged();
    }

    private void NotifyStateChanged()
    {
        var task = Task.Run(() => OnChange?.Invoke());
    }

}

Дом

@page "/"
@using BlazorApp71.Components.Pages
@inject MyService myService

<h3>Injection</h3>

<button @onclick = "clearCounter">Clear Count</button>
<br />
<br />

@myService.Counter

<Component1 myService = "myService" />

@code
{
    protected override void OnInitialized()
    {
        myService.OnChange += async () => await InvokeAsync(StateHasChanged);
    }

    private void clearCounter()
    {
        myService.clearCounter();
    }

    public void Dispose()
    {
        myService.OnChange -= async () => await InvokeAsync(StateHasChanged);
    }
}

Компонент

<h3>Component1</h3>

<button @onclick = "increaseCount">Increase Count</button>

@code {
    [Parameter]
    public MyService myService { get; set; }

    protected override void OnInitialized()
    {
        myService.OnChange += async () => await InvokeAsync(StateHasChanged);
    }

    private void increaseCount()
    {
        myService.increaseCount();
    }

    public void Dispose()
    {
        myService.OnChange += async () => await InvokeAsync(StateHasChanged);
    }
}

Существуют и другие подходы к взаимодействию между компонентами. https://chrissainty.com/3-ways-to-communicate-between-comComponents-in-blazor/ . Вы можете обратиться к этому для получения дополнительной информации.

Спасибо за решение, Фэнчжи. Оно работает! На этих выходных я пройдусь по коду и переварю его. Я новичок в Блазоре. Начал изучать C# 10 дней назад.

Picard78 16.08.2024 20:42

Другие вопросы по теме