前言

近来使用angular总是做后台系统,找了很久找到Ng Alain这个框架,用的还蛮顺手。就是官方文档略微简洁了点,用的过程中得不断结合一些小例子和官方demo来确定使用语法。之前的使用还一直挺顺利,哪怕有点问题网上也能找到相关问题的博客或者资料;但是这两天使用到访问控制列表遇到了点问题,拖了点时间几经波折后才解决,虽然是框架之外的原因,但是想以此为契机,写下第一篇博客好了。(之前也会有开发的笔记,然而每次遇到都记在有道云里面实在是很顺手,周末闲暇也没有意识整理出来,其实就是懒好了= = ;在后面也一起整理贴出来吧~ 立个小flag~)

问题

在st组件中的自定义button组中添加了acl参数后,第一次进入和刷新都会将角色重置,判断原因是使用can()打印出来为false,切换路由重新加载页面后为打印为true,能正常显示。问题就是没有找到办法让第一次进入和每次刷新都正常显示。
(app-data.json中的菜单数据也添加了acl的参数,并且startup.service.ts文件有设置角色,但是没有使用到粒度控制的权限点,全部都是通过角色来控制权限)

代码展示

API文档中st组件的自定义button组的参数

页面中设置button组的acl参数

startup文件中设置角色,一开始使用setRole(),担心是这个函数每次赋值清空所有角色的问题导致换成了attachRole()也没有解决

控制台调试情况,红框为页面中ngOnInit中can()函数的输出情况

效果展示

按正确逻辑来说,进入小部件页面应该如下

但是由于异步设置角色的原因,导致刷新和首次显示的页面如下

然后切换路由后切换回来让这个页面重新加载,页面又正常显示了

解决问题

原因

在写demo的过程中,发现了造成这个问题的原因

原因是我原先的用户权限是通过异步请求获取的,在写demo的过程中我用settimeout代替了异步请求,在demo中将settimeout注释后发现问题就解决了

原来的文件:

demo文件:

解决方案

提前将权限变量获取存入localstorage,在startup的时候获取setRole(),这样没有异步就没有这个问题了。

在src/app/core/net中添加local.storage.ts文件(路径可凭自己喜好设置)

// local.storage.ts 文件内容
import { Provider } from '@angular/core';
export class LocalStorage {public localStorage: any;constructor() {if (!localStorage) {throw new Error('Current browser does not support Local Storage');}this.localStorage = localStorage;}public set(key: string, value: string): void {this.localStorage[key] = value;}public get(key: string): string {return this.localStorage[key] || false;}public setObject(key: string, value: any): void {this.localStorage[key] = JSON.stringify(value);}public getObject(key: string): any {return JSON.parse(this.localStorage[key] || '{}');}public remove(key: string): any {this.localStorage.removeItem(key);}
}

在app.module.ts中引入

login.component.ts文件:

// login.component.ts 文件添加内容// ...
import { LocalStorage } from '@core/net/local.storage';// ...export class UserLoginComponent implements OnDestroy {constructor(private localStorage: LocalStorage, // 引入localstorage) {// 每次进入登陆页清空角色this.localStorage.remove('role');}submit() {// ...this.api.loginCheck({username: this.userName.value,password: this.password.value,}).subscribe((res: any) => {// ...// 设置用户Token信息this.tokenService.set({ token: res.data.token });this.api.findUserRights().subscribe(resp => {// 保存异步获取的角色权限this.localStorage.set('role', resp.data.acl);},() => null,() => {// 执行完成后调用的函数// 重新获取 StartupService 内容,我们始终认为应用信息一般都会受当前用户授权范围而影响this.startupSrv.load().then(() => {let url = this.tokenService.referrer.url || '/';if (url.includes('/passport')) url = '/';this.router.navigateByUrl(url);});},);});}
}

startup.service.ts文件:

写在最后

这样是解决了异步的问题,但是总觉得可能不是最好的解决办法。有几个问题我暂时也没有找到答案:aclservice 中设置的变量是保存在哪里的呢?alain里面是否本来就有它不需要我另外保存在localstorage的写法?

写demo发现原因的起因是由于我这个问题拖了两三天,百度查资料都没有找到问题,无奈下只能发邮件询问Ng Alain的开发者卡色(GitHub上留的邮箱)。在此之前我确实有考虑到可能是异步的原因,将这个异步请求await变成同步了后发现页面渲染先于startup文件的执行,而且问题也没解决,下意识就以为不是异步的问题就排除了。然后,想着的排除异步请求写死参数的debug测试也因为这样那样的问题没有进行,这是我第一次写邮件询问作者,打扰大神真的是不好意思。。。

关于Ng-alain的Acl的使用相关推荐

  1. angular项目 集成ng zorro 和ng alain

    angular项目 集成 ng zorro和ng alain(mock 和acl权限)学习笔记 这段时间,比较忙,很久没有写博客了.作为后端开发人员,第一次接触angular,以下是个人的学习心得和D ...

  2. Angular 中后台前端解决方案 - Ng Alain 介绍

    Angular 中后台前端解决方案 - Ng Alain 介绍 参考文章: (1)Angular 中后台前端解决方案 - Ng Alain 介绍 (2)https://www.cnblogs.com/ ...

  3. angular蚂蚁_Angular 中后台前端解决方案 - Ng Alain 介绍

    背景 之前项目使用过vue.js+iview,习惯了后端开发的我,总觉得使用不习惯,之前分析易企秀前端代码,接触到了angular js,完备的相关功能,类似后端开发的体验,让人耳目一新,全新的ang ...

  4. ng-alain php,Angular 中后台前端解决方案 - Ng Alain 介绍

    背景 之前项目使用过vue.js+iview,习惯了后端开发的我,总觉得使用不习惯,之前分析易企秀前端代码,接触到了angular js,完备的相关功能,类似后端开发的体验,让人耳目一新,全新的ang ...

  5. ng alain的简单使用

    1.创建一个空 angular 项目  ng new demo --style less 2.添加 ng-alain 脚手架  ng add ng-alain 3.运行项目  ng serve -o ...

  6. angularjs html编辑器,AngularJS集成wangeditor富文本编辑器

    最近用AngularJS2(ng alain)搭建的项目需求中须要富文本,在网上找了不少,要么过重,要么没有详细的集成步骤.css 下面将我本身如何将wangeditor集成在项目(项目名称myPro ...

  7. .Net Core应用框架Util介绍(二)

    Util的开源地址 https://github.com/dotnetcore/util Util的开源协议 Util以MIT协议开源,这是目前最宽松的开源协议,你不仅可以用于商业项目,还能把Util ...

  8. [Angular]——快速创建框架模板

    Angular搭建模板框架 前言:网络不好,可以使用国内淘宝镜像.本模板的脚手架使用Ng Alain,本地环境需要安装 node 和 git.技术栈基于 Typescript.Angular.g2.@ ...

  9. (非常重要).Net Core应用框架Util介绍(学习Util)

    转载地址https://blog.csdn.net/sD7O95O/article/details/82598545(看看!) 不过Util作者本人的博客地址在https://www.cnblogs. ...

最新文章

  1. Openstack 小知识点
  2. python 难度-Python分析 oj 网的题目难度和通过率的关系
  3. javax.naming.NoInitialContextException: Need to specify class name in environment or system property
  4. 六十七、二分查找算法及其四个变形问题
  5. 如何判断对象是不是出轨了?
  6. github开源大项目_GitHub刚刚发布了一份大规模的开源指南
  7. 8个球放入3个盒子方式_8种土豆做法,好吃到根本停不下来!
  8. 怎么用vc采集ni卡数据_8bit,200MS/s 低成本模拟输入高速采集卡FCFR-PCI9850
  9. 献给汇编初学者-函数调用堆栈变化分析
  10. WEB-INF下jsp页面如何访问
  11. EF-CodeFirst-3搞事
  12. 房屋出租系统(java)
  13. selenium 网址
  14. matlab 广义特征,特征值 特征向量 广义特征值 matlab
  15. 如何防止游戏通讯数据被篡改
  16. Python项目分析:预测双色球福利彩票中奖号码(随便玩玩,不要当真)
  17. 软件测试基础+微信小程序测试实战
  18. WSNs的SMAC协议的研究
  19. 怎么把ppt文字大小设置一致_PPT滚动数字原来如此简单
  20. 数组排序:声明一个整型数组并填充数据,排序,输出排序后数据,倒序输出数据。

热门文章

  1. 软件评测师考试学习计划
  2. HTML设置水平分割线
  3. 2019314输入一个日期,输出星期几
  4. 关于正向设计方法包含哪些内容
  5. shell的正向和反向
  6. 2013年最后2个月的学习目标(成果)(上次更新2013年11月18日)
  7. 现在公司都不缺人了?软件测试工作经历3年,面试居然被坑了....
  8. LeetCode题解 Day1数组的遍历
  9. Codeforces #467 (Div. 2) B. Vile Grasshoppers 蚂蚱的题目
  10. arcgis的python安装包_用Python使用arcgis中站点包arcpy