Параметр Blazor 'Global' - передача между MainLayout.razor, NavMenu.razor, Counter.razor - вперед и назад

Для приложения Blazor по умолчанию - создано с использованием шаблона сервера Visual Studio 2019 Blazor. Как создать объект GLOBAL, доступный со всех страниц и компонентов razor.

Как сделать так, чтобы значение «Текущий счетчик» было видимым и «динамически» обновлялось на страницах MainLayout, NavMenu, Index?

Current count: @currentCount

  • Используйте 1_?
  • Использовать [CascadingParameter]?
  • Создать статический класс?
  • Каков рекомендуемый подход в Blazor?

person Jon    schedule 21.04.2020    source источник


Ответы (3)


Один из способов сделать это - использовать одноэлементную службу, которая внедряется в компоненты, позволяющие подписки на события. На самом деле, я обсуждал это с кем-то еще несколько дней назад.

Просмотрите этот пост, чтобы обсудить динамическое обновление страниц из запущенных событий из синглтона, который обновляется через соединения.

Вот рабочая демонстрация, которую я адаптировал из другого проекта, над которым я работаю, когда вы запускаете этот проект. он инструктирует вас открыть другой браузер, скопировать / вставить URL-адрес, а также имеет счетчик работы, который обновляется, и текстовое поле для передачи сообщений между страницами. Введите что-нибудь в поле, нажмите кнопку, счетчик обновится на всех страницах со всех подключенных клиентов, и сообщение также перейдет на все страницы и отобразится. Работает кроссбраузерно и через соединения.

Аналогичную концепцию можно использовать для создания таких вещей, как фоновые уведомления о длительных задачах, уведомления о входе в систему и т. Д. Довольно гибкие для моих нужд.

person Nik P    schedule 22.04.2020
comment
Спасибо !!!!!!!! .. В вашей демонстрации - как вы обновляете NavMenu с помощью счетчика? ‹H4› Значение счетчика: @ Service.CountValue ‹/h4› Нужно унаследовать от IndexBase? Мне нужно обновить все компоненты ... - person Jon; 22.04.2020
comment
Я думаю, что самым простым способом было бы поместить @inherits OwningComponentBase в верхнюю часть меню навигации, а затем в блоке @code вы можете внедрить службу, добавить метод OnStatusChanged и выполнить переопределения для OnInitializedAsync и Dispose, как я, с подписками на события и отписки. Оттуда вы можете привязать счетчик, как и выше. Я не пробовал, но должно работать. Сообщите мне, если это поможет. - person Nik P; 22.04.2020
comment
Кажется, не работает - добавлен @inherits OwningComponentBase, добавлено ‹NavLink class = nav-link href = Match = NavLinkMatch.All› ‹span class = oi oi-home aria-hidden = true› ‹/span› Home ‹h4› Count Value : @ Service.CountValue ‹/h4› ‹h4› Значение счетчика: @ Service.CountValue ‹/h4› ‹h4› Значение счетчика: @ Service.CountValue ‹/h4› ‹/NavLink› добавлено после кода [Ввести защищенную службу SingleService { получать; установленный; } статус публичной строки {получить; установленный; } private async void OnStatusChangedMethod (объект-отправитель, EventArgs e) { - person Jon; 23.04.2020
comment
Посмотрите это репо, у него есть кнопка на панели навигации, которая просто реагирует на событие как на индексном экране. - person Nik P; 23.04.2020

Это можно сделать двумя способами.

CascadingParameter и «Контейнер состояния», которые очень хорошо объяснены в этом статья.

Между CascadingParameter и «Контейнером состояний» вы должны знать, как работает ваше приложение, и решать, что делать.

Наверное, для чего-то вроде GLOBAL object that is accessible from all the razor pages and components подойдет государственный контейнер.

Использовать [Параметры]?

Вместо передачи всех параметров компонентам следует использовать CascadingParameter

Создать статический класс?

Вместо создания статического класса следует использовать «Контейнер состояний».

person Vencovsky    schedule 22.04.2020

Связь между компонентами может быть реализована тремя способами, в зависимости от ваших требований и потребностей.

  1. Родительский компонент может взаимодействовать со своим дочерним компонентом, передавая параметры компонента и вызывая события, чтобы сообщить родителю, что что-то произошло, и наоборот.

  2. Вы можете включить функцию CascadingValue для передачи значения всем дочерним элементам в потоке, которые определяют свойство CascadingParameter. Каскадное значение может быть простой строкой, но также может быть полным компонентом. Это достигается путем установки атрибута Value для CascadingValue с ключевым словом this из компонента, которому вы хотите передать ссылку, например:

SomeComponent.razor

<CascadingValue Value="this">
   @ChildContent
</CascadingValue>

Мне не нравится использовать эту функцию. Собственно, никогда не использую. Утверждается, что его использование может быть проблематичным и т. Д. Однако это законная часть Blazor, и нет причин не использовать ее, если хотите ...

  1. Служба, реализующая шаблон состояния и шаблон уведомления. Обычно вы создаете такую ​​службу для управления состоянием данных вашего приложения, это включает в себя хранение данных в коллекциях, извлечение данных из базы данных и т. Д., Позволяя компонентам хранить данные в коллекциях служб, уведомлять компоненты, вызывая обработчик событий, и передавать им данные. просто добавлен другим компонентом и т. д.

Учитывая приложение Blazor по умолчанию, созданное с использованием шаблона сервера Visual Studio 2019 Blazor. Как создать ГЛОБАЛЬНЫЙ объект, доступный со всех страниц и компонентов Razor.

Вам следует реализовать услугу. Смотрите номер 3.

Создать статический класс?

Нет, никаких статических классов. Создать услугу

Каков рекомендуемый подход в Blazor?

Все зависит от ваших потребностей и требований ...

Как сделать так, чтобы значение «Текущий счетчик» было видимым и «динамически» обновлялось на страницах MainLayout, NavMenu, Index?

Только путем создания службы, которая позволяет передавать текущий счетчик из заданного места и передавать его другим компонентам, таким как MainLayout, NavMenu, Index pages.

Примечание: я подробно ответил на такие вопросы с помощью рабочего кода. Я понятия не имею об их местонахождении (пока что 400 ответов), но вы можете зайти на страницу моего профиля и найти их.

Надеюсь это поможет...

person enet    schedule 22.04.2020