Blazor Passing List <T>между компонентами - PullRequest
1 голос
/ 11 апреля 2020

У меня проблема с кодом, у меня есть макет страницы, как показано ниже. Я общаюсь с базой данных, чтобы получить данные для основного контента. Это List<SomeClass>, что я получаю из базы данных. Теперь я хочу, чтобы тот же List<SomeClass> был доступен для RightContent. Оба компонента являются пользовательскими и имеют разную компоновку, но могут совместно использовать один и тот же список, а не выполнять один и тот же вызов дважды. (Последовательность - MainContent Initialized () метод вызывается первым)

Я создал класс сервиса AppDataService со свойством ниже. Также добавляется в IServiceCollection services при запуске.

public List<SomeClass> sharedListOfSomeClass = new List<SomeClass>();

В MainContent я внедряю AppDataService и назначаю sharedListOfSomeClass со значениями базы данных. Теперь, если я внедряю AppDataService в правильный контент и пытаюсь получить доступ к sharedListOfSomeClass, я получаю его как ноль.

Я знаю, что здесь отсутствует привязка, потому что оба компонента отличаются по html и могут ' привязать его к любым тегам html.

Может ли кто-нибудь помочь мне в этом? Я хочу сделать один вызов в базу данных для обоих компонентов.

enter image description here

Ответы [ 2 ]

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

Если вы хотите иметь какое-то глобальное состояние приложения и делиться им между различными компонентами, самый разумный способ сделать это - создать класс State, который будет содержать данные глобального состояния

public class State
{
    public List<SomeClass> SomeClassObjectsCollection { get; set; } = new List<SomeClass>();
}

В вашем Startup (или Program, если вы используете Blazor wasm), вы должны добавить объект State в качестве одиночного

services.AddSingleton<State>()

и на каждой странице, где вам нужен доступ к состоянию. (или даже в _Imports, если вы хотите получить к нему частый доступ), добавьте

@inject State State

После этого на любой странице вы можете обратиться к State.SomeClassObjectsCollection и получить те же данные.

Ключевым моментом является добавление состояния в виде синглтона. Если вы добавите переходную или даже ограниченную область, контейнер зависимостей создаст новые экземпляры State.

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

Один из вариантов - передать список компонентам в качестве параметра. Определите параметр в коде компонента.

[Parameter] public List<SomeClass> sharedListOfSomeClass { get; set; }

В родительской передаче установите параметр:

<MyCustomComponent sharedListOfSomeClass="@MyVariableHoldingTheListValues" />

Другой способ, который я могу придумать, - составить список c и обратитесь к списку stati c в компонентах.

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

...