Component 간 데이터 공유 - Transfer Service
2022. 4. 20. 00:00ㆍASPNET/Blazor
반응형
하나의 data 를 모든 Component 가 사용할 때 선호되는 기술
TransferService 라는 state management class 를 따로 두고
해당 class 가 model class 를 관리하도록 하는 형태
Data/TransferService.cs
using System.Collections.ObjectModel;
namespace BlazorTutorial.Data;
public class TransferService
{
private string _data = "TransferService";
public string Data
{
get => _data;
set
{
_data = value;
DataChanged?.Invoke(this, value);
}
}
public event EventHandler<string> DataChanged = (sender, value) => { };
public ObservableCollection<ModelClass> Instances { get; set; } = new();
}
public class ModelClass
{
public string Data { get; set; } = "";
}
Pages/Transfer1.razor
@using Data
@using System.Collections.Specialized
@inject TransferService TransferService
@implements IDisposable
<div class="border border-link-success border-3 p-3">
<h3>Transfer 1</h3>
<div class="card">
<div class="card-body">
<div>Received Data: <span class="text-danger">@TransferService.Data</span></div>
<label><input type="text" @bind="TransferService.Data" @bind:event="oninput"/></label>
</div>
</div>
<div class="card">
<div class="card-body">
<div>Number of instances: <span class="text-danger">@TransferService.Instances.Count</span></div>
<button class="btn btn-primary" type="button" @onclick="AddInstance">Add Instance</button>
</div>
</div>
</div>
@code {
protected override void OnInitialized()
{
TransferService.Instances.CollectionChanged += OnCollectionChanged;
TransferService.DataChanged += OnDataChanged;
}
public void AddInstance()
{
TransferService.Instances.Add(new()
{
Data = "New instance"
});
}
public void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs args)
{
InvokeAsync(StateHasChanged);
}
public void OnDataChanged(object? sender, string value)
{
InvokeAsync(StateHasChanged);
}
public void Dispose()
{
TransferService.Instances.CollectionChanged -= OnCollectionChanged;
TransferService.DataChanged -= OnDataChanged;
}
}
Pages/Transfer2.razor
@using Data
@using System.Collections.Specialized
@inject TransferService TransferService
@implements IDisposable
<div class="border border-link-success border-3 p-3">
<h3>Transfer 2</h3>
<div class="card">
<div class="card-body">
<div>Received Data: <span class="text-danger">@TransferService.Data</span></div>
<label><input type="text" @bind="TransferService.Data" @bind:event="oninput"/></label>
</div>
</div>
<div class="card">
<div class="card-body">
<div>Number of instances: <span class="text-danger">@TransferService.Instances.Count</span></div>
<button class="btn btn-primary" type="button" @onclick="AddInstance">Add Instance</button>
</div>
</div>
</div>
@code {
protected override void OnInitialized()
{
TransferService.Instances.CollectionChanged += OnCollectionChanged;
TransferService.DataChanged += OnDataChanged;
}
public void AddInstance()
{
TransferService.Instances.Add(new()
{
Data = "New instance"
});
}
public void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs args)
{
InvokeAsync(StateHasChanged);
}
public void OnDataChanged(object? sender, string value)
{
InvokeAsync(StateHasChanged);
}
public void Dispose()
{
TransferService.Instances.CollectionChanged -= OnCollectionChanged;
TransferService.DataChanged -= OnDataChanged;
}
Pages/TransferUnion.razor
@page "/transfer-service"
<h3>TransferService</h3>
<div class="w-50">
<Transfer1 />
<Transfer2 />
</div>
Program.cs
Transferservice class 를 Dependency Injection 을 위해 services 에 등록하자
...
builder.Services.AddScoped<TransferService>();
...
Component 하나의 수정이 다른 Component 에 바로 전달 된다.
TransferService 가 그 역할을 하고 있다.
관련영상
반응형
'ASPNET > Blazor' 카테고리의 다른 글
Generic Projection (0) | 2022.04.22 |
---|---|
Content Projection (0) | 2022.04.21 |
Component 간 데이터 공유 - Parameter (0) | 2022.04.19 |
Component 간 데이터 공유 - CascadingParameter (0) | 2022.04.18 |
Component Interaction (컴포넌트간 데이터 공유) (0) | 2022.04.18 |