1+ @inject IJSRuntime JS
2+ @attribute [CascadingTypeParameter(nameof(T))]
3+ @typeparam T where T : struct
4+ @implements IAsyncDisposable
5+
6+ <CascadingValue IsFixed =" true" Value =" sliderState" >
7+ @ChildContent
8+ <div @ref =" sliderElement" ></div >
9+ </CascadingValue >
10+
11+ @code {
12+ #region Fields
13+ readonly SliderState <T > sliderState = new ();
14+ T prevValue ;
15+ T internalValue ;
16+ ElementReference sliderElement ;
17+ DotNetObjectReference <DxSlider <T >> ? dotNetRef ;
18+ IJSObjectReference ? clientModule ;
19+ IJSObjectReference ? clientSlider ;
20+ #endregion
21+
22+ #region Properties
23+ DotNetObjectReference <DxSlider <T >> DotNetRef
24+ => dotNetRef ??= DotNetObjectReference .Create (this );
25+ #endregion
26+
27+ #region Parameters
28+ [Parameter ]
29+ public RenderFragment ? ChildContent { get ; set ; }
30+
31+ [Parameter ]
32+ public T MinValue { get ; set ; }
33+
34+ [Parameter ]
35+ public T MaxValue { get ; set ; }
36+
37+ [Parameter ]
38+ public T ? Step { get ; set ; }
39+
40+ [Parameter ]
41+ public T Value { get ; set ; }
42+
43+ [Parameter ]
44+ public EventCallback <T > ValueChanged { get ; set ; }
45+
46+ [Parameter ]
47+ public SliderValueChangeMode ValueChangeMode { get ; set ; }
48+
49+ [Parameter ]
50+ public bool ShowRange { get ; set ; } = true ;
51+
52+ [Parameter ]
53+ public bool Enabled { get ; set ; } = true ;
54+ #endregion
55+
56+ #region Lifecycle Events
57+ protected override async Task OnParametersSetAsync () {
58+ if (! Value .Equals (prevValue )) {
59+ internalValue = Value ;
60+ prevValue = Value ;
61+ }
62+ await UpdateServerState ();
63+ await UpdateClientState ();
64+ }
65+
66+ protected override async Task OnAfterRenderAsync (bool firstRender ) {
67+ if (firstRender ) {
68+ await JS .LoadDxResources ();
69+ clientModule = await LoadSliderModule ();
70+ clientSlider = await LoadClientInstance (clientModule );
71+ }
72+ }
73+
74+ async ValueTask IAsyncDisposable .DisposeAsync () {
75+ if (clientSlider != null )
76+ await clientSlider .DisposeAsync ();
77+ if (clientModule != null )
78+ await clientModule .DisposeAsync ();
79+ DotNetRef ? .Dispose ();
80+ }
81+ #endregion
82+
83+ #region Methods
84+ [JSInvokable ]
85+ public async Task UpdateValueFromClient (T clientValue ) {
86+ if (! internalValue .Equals (clientValue )) {
87+ internalValue = clientValue ;
88+ await UpdateServerState ();
89+ await ValueChanged .InvokeAsync (clientValue );
90+ }
91+ }
92+
93+ ValueTask UpdateServerState () {
94+ sliderState .Value = internalValue ;
95+ sliderState .Step = Step ;
96+ sliderState .ShowRange = ShowRange ;
97+ sliderState .MinValue = MinValue ;
98+ sliderState .MaxValue = MaxValue ;
99+ sliderState .Enabled = Enabled ;
100+ sliderState .ValueChangeMode = ValueChangeMode ;
101+ return ValueTask .CompletedTask ;
102+ }
103+
104+ ValueTask UpdateClientState () {
105+ if (clientSlider != null && clientModule != null ) {
106+ return clientModule .InvokeVoidAsync (" updateStateFromServer" ,
107+ clientSlider , sliderState );
108+ }
109+ return ValueTask .CompletedTask ;
110+ }
111+
112+ ValueTask <IJSObjectReference > LoadSliderModule () {
113+ return JS .InvokeAsync <IJSObjectReference >(
114+ " import" , " ./Components/Slider/DxSlider.razor.js" );
115+ }
116+
117+ ValueTask <IJSObjectReference > LoadClientInstance (IJSObjectReference module ) {
118+ return module .InvokeAsync <IJSObjectReference >(
119+ " initializeSlider" ,
120+ sliderElement ,
121+ DotNetRef ,
122+ sliderState
123+ );
124+ }
125+ #endregion
126+ }
0 commit comments