前言

在Blazor中,我们使用@on{DOM EVENT}="{DELEGATE}"这样的Razor语法在组件标记中指定委托事件处理程序:

<button @onclick="IncrementCount">Click me</button>

但是没有提供解除委托的方法。

比如,我们需要在某种条件下才执行事件处理:

有不有阻止事件触发的方案呢?

常规解决方案

我们可以在委托事件处理程序中加上判断:

<button @onclick="()=> { if (!checkedValue) { IncrementCount(); } }">Click me</button>

但是,如果有多个组件都需要加上这个判断,这样写感觉比较繁琐。

有不有更简化的方法?

深入分析

在前面的文章中,我们已经知道Blazor组件实际上会编译成C#语句。

在obj\Debug\net5.0\Razor\Pages目录下,可以看到@onclick="IncrementCount"对应的代码如下:

__builder.AddAttribute(13, "onclick",Microsoft.AspNetCore.Components.EventCallback.Factory.Create<Microsoft.AspNetCore.Components.Web.MouseEventArgs>(this, IncrementCount));

原来是创建了一个EventCallback事件回调。

在github上查找到EventCallback.Factory.Create的实现源码[1]

private EventCallback CreateCore(object receiver, MulticastDelegate callback)
{return new EventCallback(callback?.Target as IHandleEvent ?? receiver as IHandleEvent, callback);
}

上面代码的意思,如果callback的来源是IHandleEvent,则实际回调的是IHandleEvent实现。

也就是说,只需要组件继承IHandleEvent,那么就可以控制组件上所有的事件回调了。

实现

修改代码如下:

@implements IHandleEventTask IHandleEvent.HandleEventAsync(EventCallbackWorkItem callback, object arg)
{System.Console.WriteLine("HandleEven");return callback.InvokeAsync(arg);
}private void IncrementCount()
{System.Console.WriteLine("Clicked...");currentCount++;
}

运行后可以看到,确实先执行的HandleEventAsync,再执行的@onclick实现:

结论

通过本文,我们可以了解到,只要在组件上继承IHandleEvent,就可以实现全局截获事件回调。

但是,你会发现有一个问题,Current count没有发生变化!

这是为什么呢?请听下回分解!

参考资料

[1]

实现源码: https://github.com/dotnet/aspnetcore/blob/main/src/Components/Components/src/EventCallbackFactory.cs

Hello Blazor:(11)全局截获事件执行相关推荐

  1. asp.net中page对象生命周期和各事件执行顺序

    asp.net页面事件执行顺序: 一.初始化部分: 1.构造函数:创建page类的一个实例,初始化page类的属性. 2.AddParsedSubObject函数: protected virture ...

  2. 引用asp.net母版页后,母版页和内容页的页面事件执行顺序

    如下,经测试得到的执行步骤: 第01步.内容页的 Page_PreInit 第02步.母版页的 Page_Init 第03步.内容页的 Page_Init 第04步.内容页的 Page_InitCom ...

  3. 细聊 JavaScript 的事件执行机制

    细聊 JavaScript 的事件执行机制 我使用的 Node.js 版本是 v12.13.0 的 , 11 的版本前会与11 版本后的事件循环有些区别. 线程? 都说 JavaScript 是单线程 ...

  4. jquery ajax 事件执行顺序

    jquery中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事件) 6.e ...

  5. 监听Mac OS X的全局鼠标事件

    因为Mac OS X下没有给力的鼠标手势软件,所以昨天突然想自己实现个玩玩,便研究了一番怎么监听全局的鼠标事件. 首先不能错过的是Cocoa Event-Handling Guide这篇文档.它详细介 ...

  6. JS(内置对象,全局函数,事件,事件对象)

    目录 内置对象 全局函数 事件 事件对象 内置对象 <!DOCTYPE html> <html><head><meta charset="utf-8 ...

  7. aspx页面事件执行顺序

    一.详细版 l 初始化 ² 当页面被提交请求第一个方法永远是构造函数.您可以在构造函数里面初始一些自定义属性或对象,不过这时候因为页面还没有被完全初始化所以多少会有些限制.特别地,您需要使用HttpC ...

  8. addeventlistener事件第三个参数_简析JavaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序...

    这篇文章主要介绍了javaScript 事件绑定.事件冒泡.事件捕获和事件执行顺序整理总结的相关资料 (一)事件绑定的几种方式 javascript给DOM绑定事件处理函数总的来说有2种方式:在htm ...

  9. ASP.NET 页面事件执行顺序 收藏

    ASP.NET 页面事件执行顺序 收藏 过程描述 下面是ASP.NET页面初始的过程: 1. Page_Init(); 2. Load ViewState; 3. Load Postback data ...

最新文章

  1. OSSIM下部署HIDS
  2. 使用NPOI导入导出标准Excel
  3. 记录某一天安服仔的漏洞挖掘过程
  4. Android Paint 画笔使用详解 Android自定义View(六)
  5. 300 秒搞定第一超算 1 万年的计算量,量子霸权时代已来? | CSDN 博文精选
  6. Premiere 2020安装及Premiere缺失字体处理
  7. JavaScript和TypeScript学习心得
  8. 股票python量化交易026-数据回测的概念以及现有框架
  9. Linux性能优化(七)——网络流量监控工具
  10. 鸿海成立AI研发中心 5年投资100亿新台币
  11. 7、全国天气查询API接口,免费好用
  12. 冒泡排序保姆级心得分享
  13. 每周工作总结-记录总结自己遇到问题及学习内容,及时分析,找到不足,让自己不断进步
  14. python 列表 元祖_Python_列表与元祖
  15. python显示图片 播放mp3_如何在python中从Mp3文件中提取和显示唱片集图片
  16. openlayers添加删除图层
  17. 经典SQL--求一年有多少天
  18. mysql表分段删除_SQL删除数据(分段实现大量数据的删除操作)
  19. 怎么解压linux镜像文件,linux 怎么解压文件
  20. Android平台魅力光环照耀开发征途

热门文章

  1. Oracle to_char() to_date() to_number()函数
  2. RHCE课程-初级部分6、编辑工具VIM,网络配置,进程优先,日志文件简介。
  3. .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  4. Android工程中javax annotation Nullable找不到的替代方案
  5. 基于Mint UI和MUI开发VUE项目一之环境搭建和首页的实现
  6. CodeForces 546B
  7. window.onscroll
  8. 去除HTML标签--SQL写法
  9. zune linux_快速提示:在出售Zune HD之前,先擦除所有内容
  10. 黑马程序员-WEB前端与移动开发就业班