首页 > 其他分享 >从零开始Blazor Server(13)--消息通知

从零开始Blazor Server(13)--消息通知

时间:2022-08-23 11:36:36浏览次数:88  
标签:13 OnInitialized -- void DispatchService Server Notify RefreshMenu 我们

我们现在做了用户管理、角色管理、菜单管理。

但是大家有没有发现,我们的菜单要变化的话必须要刷新页面才行。这个体验感觉不太好。


今天我们就用全局通知组件来解决这个问题。


首先我们要改造以下我们的MainLayout,之前我们是在OnInitialized中直接获取的菜单,这样肯定没法刷新了,所以我们要先把获取菜单的内容单独拿出来

    private void RefreshMenu()
    {
        _user = UserEntity.Where(x => x.UserName == Furion.App.User.FindFirstValue(ClaimTypes.Name)).First();
        if (_user == null)
        {
            return;
        }
        _menuItems = CreateMenuItems(MenuEntity.Where(x => x.Roles!.Any(y => y.Id == _user.RoleId)).ToList(), 0);
        
    }

这样我们就需要在OnInitialized调用以下我们的RefreshMenu

    protected override void OnInitialized()
    {
        base.OnInitialized();
        RefreshMenu();
    }

然后我们就可以注册全局的监听了。


MainLayout中添加

@inject IDispatchService<string> DispatchService

IDispatchService注入进来,这里我们只需要返回一个是什么就行了,所以泛型就只用了string,如果你需要接收更复杂的内容,可以修改这里的泛型类。


然后我们需要添加一个接收请求的方法

    private Task Notify(DispatchEntry<string> arg)
    {
        if (arg.Entry == "role")
        {
            RefreshMenu();
            InvokeAsync(StateHasChanged);
        }
        return Task.CompletedTask;
    }

这里我们只对角色页面进行处理。其他页面暂不处理,因为原理都是一样的,那些代码就不写了。所以我们只判断以下,如果发送的内容是role,那么我们就执行刷新菜单的操作。


然后我们需要注册这个Notify,还是在我们的OnInitialized中,终极版本如下

    protected override void OnInitialized()
    {
        base.OnInitialized();
        RefreshMenu();
        DispatchService.Subscribe(Notify);
    }

我们使用DispatchService.SubscribeNotify注册到我们的消息系统中。


同时我们在页面销毁的时候需要注销我们的订阅,所以我们的MainLayout需要实现IDisposable接口。

@implements IDisposable

然后在Dispose方法中编写注销事件

    public void Dispose()
    {
        DispatchService.UnSubscribe(Notify);
    }

然后我们来处理Role页面,这个页面里也是要先注入

@inject IDispatchService<string> DispatchService

然后我们在SavePermission方法最后,通知一下即可。

DispatchService.Dispatch(new DispatchEntry<string>(){Entry = "role"});

这里我们说一下自己是role,才可以和MainLayout判断对应。


整个SavePermission

    private void SavePermission()
    {
        if (RoleEntity == null)
        {
            return;
        }
        var menus = new List<MenuEntity>();
        SaveRole(Menus!.Where(x => x.CheckedState != CheckboxState.UnChecked), menus);
        RoleEntity.Permissions = menus;
        RoleEntity.SaveMany(nameof(RoleEntity.Permissions));
        RoleModal?.Toggle();
        DispatchService.Dispatch(new DispatchEntry<string>(){Entry = "role"});
    }

代码在代码在https://github.com/j4587698/BlazorLearn,分支lesson13

标签:13,OnInitialized,--,void,DispatchService,Server,Notify,RefreshMenu,我们
From: https://www.cnblogs.com/j4587698/p/16615544.html

相关文章

  • HTML 基础知识总结
    HTML定义和基本结构定义定义:HTML是HyperTextMark-upLanguage的首字母简写,意思是超文本标记语言,超文本指的是超链接,标记指的是标签,是一种用来制作网页的语言,这种语言......
  • linux如何使用rar
    说明:windows下rar压缩的文件放到centos7上解压的话,centos7上安装的版本需要大于或是等于windows下安装的版本 1.下载wget--no-check-certificatehttps://www.rarl......
  • vue中$forceUpdate的使用
    Vue中的$forceUpdate有强制刷新的意思,但是这个针对于深层次结构数据,数据通过赋值进行了更新,但是vue监听不到。深结构数据对于普通类型的数据来说,我们不需要操心数据绑定,Vue......
  • windows配置ssh免密登录
    公司项目分为了好几个线上环境,因为缺电没有空调,进行居家办公,需要配置免密登录。实现步骤一、生成公钥和私钥二、在客户端编辑配置文件三、将公钥拷贝到服务器四、重启......
  • 文件IO-getcwd-chdir
    chdirgetcwd#include<stdio.h>#include<stdlib.h>#include<unistd.h>#defineMAX512intmain(intargc,char*argv[]){//方法一charpath[MAX......
  • 仓库种类彼此关系和maven标准目录结构
    仓库种类彼此关系图解  maven标准目录结构一个完整的项目分为四个部分核心代代码部分配置文件部分测试代码部分测试配置文件普通的项目目录结构项目名sr......
  • 项目部署
    更完整的参考在服务器上下载nginx项目打包的命令:npmrunbuild将生成的dist文件夹里的内容放到nginx......
  • Security提高-集成JWT
    注意:请先看《springboot从0开始搭建rbac的security权限认证》再看本篇1.引入jwt依赖<!--JWT-->    <dependency>      <groupId>io.jsonwebtoken<......
  • 阿里云Linux服务器安装Maven实战教程
    下载地址https://maven.apache.org/download.cgi文件上传把下载的文件上传到阿里云服务器/usr/local/software的目录(使用工具)windows命令行工具:puttywindows......
  • KBJ610-ASEMI研磨机专用整流桥KBJ610
    编辑:llKBJ610-ASEMI研磨机专用整流桥KBJ610型号:KBJ610品牌:ASEMI封装:KBJ-4特性:整流扁桥正向电流:6A反向耐压:1000V恢复时间:ns引脚数量:4芯片个数:4芯片尺寸:88MIL浪......