Skip to content

Commit ffc172d

Browse files
authored
Splitter: fix dispose logic (#6170)
* Splitter: fix dispose logic * auto generate id
1 parent 04c9468 commit ffc172d

File tree

3 files changed

+61
-29
lines changed

3 files changed

+61
-29
lines changed

Source/Extensions/Blazorise.Splitter/JSSplitModule.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1-
using System.Collections.Generic;
1+
#region Using directives
2+
using System.Collections.Generic;
23
using System.Threading.Tasks;
34
using Blazorise.Modules;
45
using Microsoft.AspNetCore.Components;
56
using Microsoft.JSInterop;
7+
#endregion
68

79
namespace Blazorise.Splitter;
810

911
/// <summary>
1012
/// Default implementation of the splitter JS module.
1113
/// </summary>
12-
public class JSSplitModule : BaseJSModule
14+
public class JSSplitModule : BaseJSModule,
15+
IJSDestroyableModule
1316
{
1417
#region Constructor
1518

@@ -30,12 +33,21 @@ public JSSplitModule( IJSRuntime jsRuntime, IVersionProvider versionProvider, Bl
3033
/// <summary>
3134
/// Initializes a new splitter instance.
3235
/// </summary>
36+
/// <param name="elementId">Id of the splitter element.</param>
37+
/// <param name="elementRef">Reference to the splitter element.</param>
3338
/// <param name="sectionElementRefs">Sections of the splitter.</param>
3439
/// <param name="splitterOptions">Splitter configuration options.</param>
3540
/// <param name="splitterGutterOptions">Gutter configuration options</param>
3641
/// <returns>A <see cref="IJSObjectReference"/> to the Splitter object.</returns>
37-
public virtual ValueTask<IJSObjectReference> InitializeSplitter( IEnumerable<ElementReference> sectionElementRefs, SplitterOptions splitterOptions, SplitterGutterOptions splitterGutterOptions )
38-
=> InvokeSafeAsync<IJSObjectReference>( "initializeSplitter", sectionElementRefs, splitterOptions, splitterGutterOptions );
42+
public virtual ValueTask InitializeSplitter( ElementReference elementRef, string elementId, IEnumerable<ElementReference> sectionElementRefs, SplitterOptions splitterOptions, SplitterGutterOptions splitterGutterOptions )
43+
{
44+
return InvokeSafeVoidAsync( "initializeSplitter", elementRef, elementId, sectionElementRefs, splitterOptions, splitterGutterOptions );
45+
}
46+
47+
public virtual ValueTask Destroy( ElementReference elementRef, string elementId )
48+
{
49+
return InvokeSafeVoidAsync( "destroy", elementRef, elementId );
50+
}
3951

4052
#endregion
4153

Source/Extensions/Blazorise.Splitter/Splitter.razor.cs

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -80,24 +80,13 @@ protected override async Task OnAfterRenderAsync( bool firstRender )
8080
/// <inheritdoc/>
8181
protected override async ValueTask DisposeAsync( bool disposing )
8282
{
83-
if ( disposing )
83+
if ( disposing && Rendered )
8484
{
85-
if ( JSSplitInstance is not null )
85+
if ( JSModule is not null )
8686
{
87-
var task = JSSplitInstance.InvokeVoidAsync( "destroy" );
87+
await JSModule.SafeDestroy( ElementRef, ElementId );
8888

89-
try
90-
{
91-
await task;
92-
}
93-
catch when ( task.IsCanceled )
94-
{
95-
}
96-
catch ( Microsoft.JSInterop.JSDisconnectedException )
97-
{
98-
}
99-
100-
await JSSplitInstance.DisposeAsync();
89+
await JSModule.SafeDisposeAsync();
10190
}
10291
}
10392

@@ -163,12 +152,11 @@ private async Task CreateInstance()
163152

164153
try
165154
{
166-
if ( JSSplitInstance is not null )
167-
await JSSplitInstance.InvokeVoidAsync( "destroy" );
155+
await JSModule.Destroy( ElementRef, ElementId );
168156

169157
if ( splitterSections.Count > 0 )
170158
{
171-
JSSplitInstance = await JSModule.InitializeSplitter( splitterSections.Select( x => x.ElementRef ), new SplitterOptions
159+
await JSModule.InitializeSplitter( ElementRef, ElementId, splitterSections.Select( x => x.ElementRef ), new SplitterOptions
172160
{
173161
Sizes = splitterSections.Any( x => x.Size != null )
174162
? splitterSections.Select( x => new JavascriptNumber( x.Size ?? 0 ) ).ToArray()
@@ -202,16 +190,14 @@ private async Task CreateInstance()
202190

203191
#region Properties
204192

193+
/// <inheritdoc />
194+
protected override bool ShouldAutoGenerateId => true;
195+
205196
/// <summary>
206197
/// Gets or sets the <see cref="JSSplitModule"/> instance.
207198
/// </summary>
208199
protected JSSplitModule JSModule { get; private set; }
209200

210-
/// <summary>
211-
/// Gets or sets the reference to the JS splitter instance.
212-
/// </summary>
213-
protected IJSObjectReference JSSplitInstance { get; private set; }
214-
215201
/// <summary>
216202
/// Gets or sets the JS runtime.
217203
/// </summary>

Source/Extensions/Blazorise.Splitter/wwwroot/blazorise.splitter.js

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import './vendors/split.js?v=1.8.0.0';
22

3+
import { getRequiredElement } from "../Blazorise/utilities.js?v=1.8.0.0";
4+
35
document.getElementsByTagName("head")[0].insertAdjacentHTML("beforeend", "<link rel=\"stylesheet\" href=\"_content/Blazorise.Splitter/blazorise.splitter.css?v=1.8.0.0\" />");
46

7+
const _instances = [];
8+
59
/**
610
* Configuration options for Split
711
* @typedef {Object} SplitOptions
@@ -22,7 +26,12 @@ document.getElementsByTagName("head")[0].insertAdjacentHTML("beforeend", "<link
2226
* @param {SplitOptions} splitterOptions Configuration options
2327
* @return A split instance
2428
*/
25-
export function initializeSplitter(elements, splitterOptions, splitterGutterOptions) {
29+
export function initializeSplitter(element, elementId, elements, splitterOptions, splitterGutterOptions) {
30+
element = getRequiredElement(element, elementId);
31+
32+
if (!element)
33+
return;
34+
2635
const parsedSplitterOptions = parseOptions(splitterOptions);
2736

2837
if (splitterGutterOptions && splitterGutterOptions.backgroundImage) {
@@ -38,7 +47,32 @@ export function initializeSplitter(elements, splitterOptions, splitterGutterOpti
3847
return gutterElement;
3948
};
4049

41-
return Split(elements, parsedSplitterOptions);
50+
const split = Split(elements, parsedSplitterOptions);
51+
52+
const instance = {
53+
element: element,
54+
elementId: elementId,
55+
split: split
56+
};
57+
58+
_instances[elementId] = instance;
59+
}
60+
61+
export function destroy(element, elementId) {
62+
const instances = _instances || {};
63+
const instance = instances[elementId];
64+
65+
if (instance && instance.split) {
66+
if (instance.split) {
67+
try {
68+
instance.split.destroy();
69+
} catch (e) {
70+
console.error(e);
71+
}
72+
}
73+
74+
delete instances[elementId];
75+
}
4276
}
4377

4478
/**

0 commit comments

Comments
 (0)