У меня в основном три компонента, один из которых создает сообщение, а остальные являются получателями сообщения.
Код: Выделить всё
public class Messager : IMessager
{
private readonly Subject _subject = new();
private readonly List _disposables = [];
public void Dispose()
{
_subject?.Dispose();
foreach (var eachDisposable in _disposables)
{
eachDisposable?.Dispose();
}
}
public void Emit(int value)
{
_subject.OnNext(value);
}
public void OnEmit(Action action)
{
_disposables.Add(_subject.Subscribe(action));
}
}
Код: Выделить всё
ComponentOne.razor
Код: Выделить всё
@inject IMessager _messager;
@value
@code {
private int value;
protected override void OnInitialized()
{
base.OnInitialized();
_messager.OnEmit(Action);
}
private void Action(int value)
{
this.value = value;
StateHasChanged();
}
}
Код: Выделить всё
@inject IMessager _messager;
ClickMe
@code {
private int count = 0;
private void ClickMe()
{
count++;
_messager.Emit(count);
}
}
Код: Выделить всё
@page "/"
Итак, вот некоторые из моих вопросов:
Вопрос 1: IMessager зарегистрирован в Scoped, но когда я попробовал с Transient, он не работает, почему? (Потому что ComponentOne.razor и MessageCreator.razor должны иметь один и тот же объект. Я думаю)
Вопрос 2. Есть ли способ отказаться от подписки. Скажем так, в некоторых случаях ComponentOne не хочет получать никаких уведомлений?
Вопрос 3. Я хочу, чтобы сообщение генерировалось при нажатии на ComponentOne -> MessageCreator - > ClickMe должен получать только от ComponentOne, но не от ComponentTwo.(или мне нужно использовать что-то другое, кроме Subjct)
Подробнее здесь: https://stackoverflow.com/questions/792 ... m-reactive