angular - 如何为每个组件实例生成一个角度持久的唯一标识符?
问题描述
我需要生成一个 id 以便将我的过滤器组件应用的最后一个过滤器保存在 DB 上。问题是过滤器组件在我的应用程序的几个部分都有实例,我需要一种方法来为每个实例生成一个持久 id,以便保存到数据库中。
我尝试使用 nghost 属性,但这在每个实例中都是相同的。
private getId(): any {
const id = this.constructor['ɵcmp'].id;
return id;
}
我不能依赖随机生成,因为如果用户更改主机或浏览器,生成的 id 可能会改变。有没有办法做到这一点?
这是我目前的采样器
在我最后一次尝试中,我添加了一个静态数字 var 以获得组件的计数器,然后将此计数器添加到主机 ID
export class ChildComponent {
static index = 0;
unique = this.constructor['ɵcmp'].id + ChildComponent.index;
constructor() {
ChildComponent.index ++;
}
}
这个解决方案不能提供我需要的所有东西,因为生成 ID 可能会根据不同过滤器的执行顺序而有所不同,这可能会导致应用程序的两个不同路由中的两个过滤器获得相同的 id。
为了防止这种情况,我添加了路由器服务以获取当前 url:
constructor(private router: Router) {
ChildComponent.index ++;
this.unique = btoa(this.constructor['ɵcmp'].id + ChildComponent.index + this.router.url);
}
现在我意识到,如果我们直接通过 url 导航,或者如果我们从主页导航,我们会为同一个组件实例获得不同的 id。
解决方案
如果您想为组件的每个实例创建一个标识符,您可以创建自己的标识符GUID
并将其提供给您的变量unique
。一个工作示例:
export class ChildComponent implements OnInit{
unique = '';
ngOnInit() {
this.unique = this.uuidv4()
}
uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
}
推荐阅读
- angular - 禁用 Angular CLI 自动生成模板和 ng generate component 命令显示错误“未定义样式”
- c# - 如何将字符串列表绑定到 ASP.NET MVC 中的 datalist id?
- c - 对象宏的最大尺寸
- r - 有没有比“for”循环更有效的方法来填充额外的列?
- c - 如何从高架摄像头考虑建筑轨迹中像素的旋转?
- php - 在 foreach 循环中努力评估 if 语句
- tensorflow - 在缺少操作的情况下扩展 TF Lite GPU 委托
- java - MessageQueue 回调中的异常:handleReceiveCallback 洪水填充算法 Android
- javascript - 通过预处理更改元素 ID 和类
- html - 如何修复 TypeError:无法读取未定义的属性“修剪”