现象
最近的一个项目使用了ABP框架(ASP.NET Core+Angular),开发中想要修改通知提示的弹窗默认位置(默认位置是左下角,想要修改到中间上方),代码如下,但发现修改无效。
abp.notify.success("创建成功","",{ positionClass: "toast-top-center" });
原因
经过查看相关部分的内部代码发现,问题的根本原因,是因为ABP新旧版本的差别导致的。ABP框架(ASP.NET Core+Angular)中,前端的通知提示用到了一个封装的模块notify
。在低版本中,这个模块内部依赖toastr
组件,这一点在介绍ABP框架的博客文章中都有说明。而上述不起效的代码,就是按照这个旧版本来的。而当前的项目,用的是新版ABP框架,内部代码已经有所改变。
同时,这些文章还提到一个Message
模块,也是用来弹窗提示的。不过与Notify不同的是,Message
一般为模态弹窗,Notify
一般为非模态。而Message
模块中,用到的是sweetalert
组件。
以上是在低版本中的情况(具体是哪些版本则不知晓,但下文会介绍具体的区分方法),但在新版本中,情况有所不同。
在新版本中,sweetalert
组件更新到sweetalert2
,notify
内部不再依赖toastr
组件,而是转而同Message
组件一起依赖sweetalert2
组件。
toastr
和sweetalert2
的用法相似,但具体的配置还是很不同的。可是这种差别,经过notify
模块的封装,对于外部调用者来说是察觉不到的。这就导致了上述的现象。
解决方案
知道了原因,问题自然也就可以迎刃而解。只要按照sweetalert2
组件的使用规则来配置即可。代码如下所示。注意这里,设置位置的属性叫“position”,已经与toastr
组件不同了。
abp.notify.success("创建成功","",{ position: "top" });
根据sweetalert2
组件的官方文档介绍,其位置属性可以取9种值,分别为:'top', 'top-start', 'top-end', 'center', 'center-start', 'center-end', 'bottom', 'bottom-start', or 'bottom-end'。其实也就是对应着九宫格的位置。
扩展
下面展示一下两个不同版本,其内部封装的代码。这就是上文说的区分两个版本的证据。
在新版中,在assets
文件夹下,有一个abp-web-resources
文件夹,其内有abp.sweet-alert.js
文件。这些都是可以直接在VS Code中看到的。
在这个文件中,定义了notify.success
等方法的具体实现。这里用到了Swal
这个对象。可见的代码中看不到这个对象的定义和构造过程,也看不出跟sweetalert2
组件有什么关联,还是在网上搜索才找到的。
而在旧版本中,无法直接在VS Code中找到abp.sweet-alert.js
,它存在于node_modules
文件夹下,可以在资源浏览器中找到。其路径为:node_modules\abp-web-resources\Abp\Framework\scripts\libs\abp.sweet-alert.js
。
但是在这个文件中,只有关于Message
的实现,没有关于notify
的任何代码。这就说明,在就版本中,Notify
的底部依赖跟Message
是不同的,但在新版本中是相同的(都依赖sweetalert2
)。
参考资料:
ABP博客文章
sweetalert2官方文档
toastr组件的Github地址
toastr组件的演示地址(在我的浏览器中测试不起作用)
网友评论