【问题标题】:How to update NavMenu in Blazor web assembly如何在 Blazor Web 程序集中更新 NavMenu
【发布时间】:2020-11-05 21:01:20
【问题描述】:

我需要在 Web 程序集中动态更新我的侧导航栏。

你能建议我怎么做吗?

@page "/ChildPage"

    @code{
        public List<string> menus = new List<string>();
        NavMenu n = new NavMenu();
        protected override async Task OnInitializedAsync()
        {
            menus.Add("Content 1");
            menus.Add("Content 2");

            await Task.Run(() => n.MenuItems = menus);
        }
    }

在 Navmenu 剃须刀中做了一些如下操作。

<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
    <ul class="nav flex-column">
        @if (MenuItems != null)
        {
            @foreach (var menu in MenuItems)
            {
                <li class="nav-item px-3">
                    <NavLink class="nav-link" href="Page1">
                        <span class="oi oi-plus" aria-hidden="true"></span> @menu
                    </NavLink>
                </li>
            }
        }

    </ul>
</div>



@code {
    private bool collapseNavMenu = true;

    private string NavMenuCssClass => collapseNavMenu ? "collapse" : null;

    private void ToggleNavMenu()
    {
        collapseNavMenu = !collapseNavMenu;
    }

    public List<string> MenuItems = new List<string>() { "Page 1", "Page 2"};
}

你能建议我如何从每个页面更新导航栏吗?

【问题讨论】:

  • ChildPage 组件中的代码与 MainLayout 有什么关系?请详细说明您要实现的目标...
  • 旁注,不要在 WebAssembly 中使用 Task.Run()。目前它是无效的,当 Wasm 将来确实获得线程时,这种代码可能会中断。
  • 我想从一个页面更新菜单项
  • 顺便说一句,我只使用 webassembly。我没有任何服务器代码。

标签: c# blazor webassembly


【解决方案1】:

你可以像这样创建一个服务

public interface IMenuService
{
  List<MenuItem> AdditionalMenuItems { get; set; }
  event EventHandler<EventArgs> OnChanged;
  void NotifyChanged();
}

将其注册为作用域

services.AddScoped<IMenuService, MenuService>();

您可以将其注入您的页面并添加

@inject IMenuService MenuService

protected override void OnInitialized()
{
  MenuService.Add(whatever);
  MenuService.NotifyChanged();
}

在你的布局中

@implements IDisposable
@inject IMenuService MenuService

@foreach(MenuItem menuItem in MenuService.AdditionalMenuItems)
{
  // Whatever
}

// code section
protected override void OnInitialized()
{
  MenuService.OnChanged += MenuChanged;
}

void IDisposable.Dispose()
{
  MenuService.OnChanged -= MenuChanged;
}

private void MenuChanged(EventArgs e)
{
  InvokeAsync(StateHasChanged);
}

【讨论】:

  • HI services.AddScoped();,编译器显示没有 MenuService 类。我们需要创建 MenuServiceClass 吗?
  • 因为你还没有创建类。
  • 它可以在 WebAssembly 中工作吗?我只有 WebAssembly 项目。
  • 嗨,彼得。感谢您的解决方案。但它似乎是第一个 NavItem foreach 被调用。页面初始化后。
  • 我不明白。
猜你喜欢
  • 2021-10-31
  • 2020-11-16
  • 1970-01-01
  • 2021-09-21
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2022-01-16
相关资源
最近更新 更多