@@ -27,7 +27,9 @@ public class LazyRouter : IComponent, IHandleAfterRender, IDisposable
27
27
28
28
[ Inject ] private IAssemblyLoader _assemblyLoader { get ; set ; } = null ! ;
29
29
30
- [ Parameter ] public RenderFragment < string > Loading { get ; set ; } = null ! ;
30
+ [ Parameter ] public RenderFragment < string ? > Loading { get ; set ; } = null ! ;
31
+
32
+ private bool isFirstRender = true ;
31
33
32
34
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
33
35
@@ -77,6 +79,7 @@ public void Attach(RenderHandle renderHandle)
77
79
_renderHandle = renderHandle ;
78
80
_baseUri = NavigationManager . BaseUri ;
79
81
_locationAbsolute = NavigationManager . Uri ;
82
+
80
83
NavigationManager . LocationChanged += OnLocationChanged ;
81
84
}
82
85
@@ -113,7 +116,8 @@ public async Task SetParametersAsync(ParameterView parameters)
113
116
throw new InvalidOperationException ( $ "The { nameof ( LazyRouter ) } component requires a value for the parameter { nameof ( NotFound ) } .") ;
114
117
}
115
118
116
- await RefreshRouteTable ( ) . ConfigureAwait ( true ) ; // only render thread
119
+ await PerformInitialRouting ( ) ;
120
+ await RefreshLazyRouteTableAsync ( ) ;
117
121
}
118
122
119
123
public void Dispose ( )
@@ -163,7 +167,7 @@ private async Task PerformModuleLoadAsync(string moduleName)
163
167
164
168
if ( lazyPageAssembly == null )
165
169
{
166
- _renderHandle . Render ( Loading ( moduleName ) ) ; // show loading RenderFragment
170
+ Render ( Loading ( moduleName ) ) ; // show loading RenderFragment
167
171
168
172
lazyPageAssembly = await _assemblyLoader
169
173
. LoadAssemblyByNameAsync ( new AssemblyName
@@ -183,12 +187,23 @@ private async Task PerformModuleLoadAsync(string moduleName)
183
187
? new [ ] { lazyPageAssembly }
184
188
: AdditionalAssemblies . Concat ( new [ ] { lazyPageAssembly } ) ;
185
189
186
- await RefreshRouteTable ( ) ; // from render thread
190
+ await RefreshLazyRouteTableAsync ( ) ;
187
191
}
188
192
189
- private async Task RefreshRouteTable ( )
193
+ private Task PerformInitialRouting ( )
190
194
{
191
- var createLazyRoutesTask = GetLazyRoutes ( ) . ConfigureAwait ( true ) ; // continue in render thread
195
+ var assemblies = AdditionalAssemblies == null
196
+ ? new [ ] { AppAssembly }
197
+ : new [ ] { AppAssembly } . Concat ( AdditionalAssemblies ) ;
198
+
199
+ Routes = RouteTableFactory . Create ( assemblies ) ;
200
+
201
+ return PerformNavigationAsync ( isNavigationIntercepted : false ) ; // from render thread
202
+ }
203
+
204
+ private async Task RefreshLazyRouteTableAsync ( )
205
+ {
206
+ var createLazyRoutesTask = GetLazyRoutes ( ) ; // continue in render thread
192
207
193
208
var assemblies = AdditionalAssemblies == null
194
209
? new [ ] { AppAssembly }
@@ -258,7 +273,7 @@ private Task PerformNavigationAsync(bool isNavigationIntercepted)
258
273
typeHandler ,
259
274
context . Parameters ?? _emptyParametersDictionary ) ;
260
275
261
- _renderHandle . Render ( Found ( routeData ) ) ;
276
+ Render ( Found ( routeData ) ) ;
262
277
return Task . CompletedTask ;
263
278
}
264
279
@@ -270,20 +285,27 @@ private Task PerformNavigationAsync(bool isNavigationIntercepted)
270
285
}
271
286
}
272
287
273
- if ( ! isNavigationIntercepted )
288
+ if ( isFirstRender )
274
289
{
275
- // We did not find a Component that matches the route.
276
- // Only show the NotFound content if the application developer programatically got us here i.e we did not
277
- // intercept the navigation. In all other cases, force a browser navigation since this could be non-Blazor content.
278
- _renderHandle . Render ( NotFound ) ;
290
+ Render ( Loading ( null ) ) ;
291
+ return Task . CompletedTask ;
279
292
}
280
- else
293
+
294
+ if ( ! isNavigationIntercepted )
281
295
{
282
- NavigationManager . NavigateTo ( _locationAbsolute , forceLoad : true ) ;
296
+ Render ( NotFound ) ;
283
297
}
284
298
299
+ NavigationManager . NavigateTo ( _locationAbsolute , forceLoad : true ) ;
300
+
285
301
return Task . CompletedTask ;
286
302
}
303
+
304
+ private void Render ( RenderFragment fragment )
305
+ {
306
+ _renderHandle . Render ( fragment ) ;
307
+ isFirstRender = false ;
308
+ }
287
309
}
288
310
289
311
internal class LazyRouteHandler
0 commit comments