Изменение обработки событий в Blazor для дочернего компонента, привязанного к массиву

#blazor

Вопрос:

У меня есть модель, которая отлично привязана к элементам управления формой и более или менее выполняет то, что ей говорят (программное обеспечение-отличное начало).

Модель данных довольно ванильная:

 public class Enrolment
{
    public string Id { get; set; }
    public Parent[] Parents { get; set; }
    public Child[] Children { get; set; }
    ...
}

public class Parent
{
    public string FamilyName { get; set; }
    public string FirstName { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
}
 

Когда я нажимаю кнопку на своей форме верхнего уровня «Регистрация.razor» (форма «родитель», но если я начну слишком много говорить о родителях и детях, это может привести к путанице), я добавляю еще одного родителя в массив родителей []. Учитывая, что я, возможно, захочу добавить от 1 до 4 родителей, я решил, что сделаю компонент для обработки этой части формы:

     @foreach(Parent parent in newEnrolment.Parents){
        <Caregiver RegisteredParent=parent OnEdit=CaregiverEdit />
    }
 

Компонент «Воспитатель» выглядит следующим образом:

 <div className="row">
    <div className="column">
        <label htmlFor="lastName">Last name</label>
        <input type="text" placeholder="Last name" id="lastName" @bind=RegisteredParent.FamilyName />
    </div>
    <div className="column">
        <label htmlFor="firstName">Name</label>
        <input type="text" placeholder="First name" @bind=RegisteredParent.FirstName id="firstName" />
    </div>
    <div className="column">
        <label htmlFor="email">Email</label>
        <input type="text" placeholder="Email" id="email" @bind=RegisteredParent.Email />
    </div>
</div>
<button type="button" @onclick="OnSaveClick">Save</button>

@code {
    [Parameter]
    public Parent RegisteredParent { get; set; }

    [Parameter]
    public EventCallback<Parent> OnEdit { get; set; }


    private async Task OnSaveClick(MouseEventArgs e)
    {
        Console.WriteLine($"Saved {RegisteredParent.FirstName} {RegisteredParent.FamilyName}.");
        await OnEdit.InvokeAsync(RegisteredParent);
    }

}
 

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

Ответ №1:

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

Ваши данные должны храниться в сервисе. Вероятно, в этом случае область действия ограничена, но без общей картины?? Давайте назовем это EnrolmentService .

 // pseudocode
class EnrolmentService 
{

private List<dataitem> datalist {get; set;}

public Event EventHandler ListUpdated;

public dataitem GetRecord(id) .....

public bool AddRecord(dataitem) 
{
  trigger ListUpdated
 ....
}

blah, blah,...
}
 

Затем вы можете добавить некоторые методы CRUD в службу для взаимодействия с набором данных.

Затем вы можете получить доступ к службе через DI [внедрение зависимостей]

 [Inject]private EnrolmentService DataService {get; set;}
 

Таким образом, и ваш редактор, и средство просмотра списков получают доступ к одним и тем же данным в одной и той же службе.

В сервисе есть публичное событие, что-то вроде OnListUpdated того, что вы запускаете каждый раз, когда добавляете/редактируете значение в своем редакторе. Затем вы можете подключить компонент списка к событию и обновить его представление, когда что-то изменится.

В общем, пытаться соединить компоненты вместе-не очень хорошая идея.

Комментарии:

1. Я сохранил это общее и краткое изложение. Ваше резюме предполагает, что вам нужны некоторые указатели, а не много конкретного кода. Документы MS на Blazor довольно хороши. В качестве дополнения к этому — здесь есть несколько самоуверенное репозиторий Github , в котором гораздо больше информации об редактировании в Blazor и демо-проекте.