+@implements IDisposable
+
+
@ChildContent
@@ -34,7 +36,7 @@
#region injection services
[Inject]
- NavigationManager _navManager { get; set; }
+ NavigationManager _navManager { get; set; } = default!;
#endregion
#region variables
@@ -103,7 +105,7 @@
ChildContent += item;
}
- StateHasChanged();
+ _ = InvokeAsync(StateHasChanged);
}
///
@@ -115,7 +117,15 @@
void OnLocationChanged(object sender, LocationChangedEventArgs e)
{
relativePath = _navManager.ToBaseRelativePath(_navManager.Uri);
- StateHasChanged();
+ _ = InvokeAsync(StateHasChanged);
+ }
+
+ void IDisposable.Dispose()
+ {
+ if (_navManager is not null)
+ {
+ _navManager.LocationChanged -= OnLocationChanged;
+ }
}
#endregion
}
diff --git a/src/TailBlazor.NavBar/Helpers.cs b/src/TailBlazor.NavBar/Helpers.cs
index 8448179..3b86c25 100644
--- a/src/TailBlazor.NavBar/Helpers.cs
+++ b/src/TailBlazor.NavBar/Helpers.cs
@@ -5,6 +5,8 @@ namespace TailBlazor.NavBar
{
public class Helpers
{
+ static readonly EventCallbackFactory CallbackFactory = new();
+
///
/// Build the nav items, which are a tags
/// Based on the NavItem return it will add the appropriate attributes/content
@@ -41,8 +43,15 @@ public static RenderFragment BuildNavItemFragment(NavItem navItem, string relati
if (!string.IsNullOrEmpty(navItem.Href))
i.AddAttribute(3, "href", navItem.Href);
- if (navItem.Action != null)
- i.AddAttribute(4, "onclick", navItem.Action);
+ if (navItem.OnClick.HasDelegate)
+ {
+ i.AddAttribute(4, "onclick", navItem.OnClick);
+ }
+ else if (navItem.Action != null)
+ {
+ var receiver = navItem.Action.Target ?? navItem;
+ i.AddAttribute(4, "onclick", CallbackFactory.Create(receiver, navItem.Action));
+ }
if (navItem.PreventDefaultClick)
i.AddEventPreventDefaultAttribute(5, "onclick", true);
diff --git a/src/TailBlazor.NavBar/LeftNavBarItem.razor b/src/TailBlazor.NavBar/LeftNavBarItem.razor
index 080a0a1..ab05960 100644
--- a/src/TailBlazor.NavBar/LeftNavBarItem.razor
+++ b/src/TailBlazor.NavBar/LeftNavBarItem.razor
@@ -1,4 +1,6 @@
-
+@implements IDisposable
+
+
@ChildContent
@@ -34,7 +36,7 @@
#region injection services
[Inject]
- NavigationManager _navManager { get; set; }
+ NavigationManager _navManager { get; set; } = default!;
#endregion
#region variables
@@ -102,7 +104,7 @@
ChildContent += item;
}
- StateHasChanged();
+ _ = InvokeAsync(StateHasChanged);
}
///
@@ -114,7 +116,15 @@
void OnLocationChanged(object sender, LocationChangedEventArgs e)
{
relativePath = _navManager.ToBaseRelativePath(_navManager.Uri);
- StateHasChanged();
+ _ = InvokeAsync(StateHasChanged);
+ }
+
+ void IDisposable.Dispose()
+ {
+ if (_navManager is not null)
+ {
+ _navManager.LocationChanged -= OnLocationChanged;
+ }
}
#endregion
}
diff --git a/src/TailBlazor.NavBar/MobileNavBarContent.razor b/src/TailBlazor.NavBar/MobileNavBarContent.razor
index 2245a2a..fd68fff 100644
--- a/src/TailBlazor.NavBar/MobileNavBarContent.razor
+++ b/src/TailBlazor.NavBar/MobileNavBarContent.razor
@@ -12,6 +12,7 @@
///
/// Container class
///
+ [Parameter]
public string Class { get; set; }
///
@@ -32,10 +33,10 @@
#region injection services
[Inject]
- NavigationManager _navManager { get; set; }
+ NavigationManager _navManager { get; set; } = default!;
[Inject]
- IResizeListener _listener { get; set; }
+ IResizeListener _listener { get; set; } = default!;
#endregion
#region variables
@@ -45,8 +46,6 @@
// Boolean Variables
bool mobileMenuOpen = false;
- // Model Variables
- BrowserWindowSize browser = new BrowserWindowSize();
#endregion
#region intializers
@@ -57,10 +56,10 @@
// hook to OnLocationChanged() so we can change the active class for the element
_navManager.LocationChanged += OnLocationChanged;
- if(Items != null) {
+ if (Items != null) {
foreach (var navItem in Items)
{
- ChildContent = Helpers.BuildNavItemFragment(navItem, relativePath);
+ ChildContent += Helpers.BuildNavItemFragment(navItem, relativePath);
}
}
}
@@ -69,7 +68,7 @@
{
if(firstRender)
{
- _listener.OnResized += WindowResized;
+ _listener?.OnResized += WindowResized;
}
}
@@ -93,7 +92,7 @@
public void HamburgerClicked()
{
mobileMenuOpen = !mobileMenuOpen;
- StateHasChanged();
+ _ = InvokeAsync(StateHasChanged);
}
#endregion
@@ -107,29 +106,35 @@
void OnLocationChanged(object sender, LocationChangedEventArgs e)
{
relativePath = _navManager.ToBaseRelativePath(_navManager.Uri);
- StateHasChanged();
+ _ = InvokeAsync(StateHasChanged);
}
void IDisposable.Dispose()
{
// Always use IDisposable in your component to unsubscribe from the event.
- // Be a good citizen and leave things how you found them.
+ // Be a good citizen and leave things how you found them.
// This way event handlers aren't called when nobody is listening.
- _listener.OnResized -= WindowResized;
+ if (_listener is not null)
+ {
+ _listener.OnResized -= WindowResized;
+ }
+
+ if (_navManager is not null)
+ {
+ _navManager.LocationChanged -= OnLocationChanged;
+ }
}
async void WindowResized(object _, BrowserWindowSize window)
{
- browser = window;
-
// Check a media query to see if it was matched. We can do this at any time, but it's best to check on each resize
- if(!await _listener.MatchMedia(Breakpoints.SmallDown))
+ if(_listener is not null && !await _listener.MatchMedia(Breakpoints.SmallDown))
{
mobileMenuOpen = false;
}
// We're outside of the component's lifecycle, be sure to let it know it has to re-render.
- StateHasChanged();
+ await InvokeAsync(StateHasChanged);
}
#endregion
}
diff --git a/src/TailBlazor.NavBar/NavBarContent.razor b/src/TailBlazor.NavBar/NavBarContent.razor
index caf5b7a..dd0f5b1 100644
--- a/src/TailBlazor.NavBar/NavBarContent.razor
+++ b/src/TailBlazor.NavBar/NavBarContent.razor
@@ -10,7 +10,7 @@
}
else
{
-