![](/img/trans.png)
[英]`[1] == [1]` returns “false” and `[1] == 1` returns “true”?
[英]Angular Material List Option returns true, even if false
<mat-selection-list>
<ng-container *ngFor="let cat of permissionCategories()">
<mat-divider></mat-divider>
<div mat-subheader>{{ cat }}</div>
<mat-list-option *ngFor="let permission of permissionsOfCategory(cat)"
[selected]="havePermission(permission)"
>
{{ permission.Name }}
</mat-list-option>
</ng-container>
</mat-selection-list>
和
havePermission(permission: Permission): boolean {
return this.currentRankPermissions.includes(permission.Id);
}
我检查了百次所有值,它们是正确的。有一些权限, havePermission
返回真或假
UseLspdTablet true
ModifyRanks true
AccessCitizenIndex真
访问公民注册表false
ArrestMandateCitizen false
更改公民电话号码false
修改CitizenWanted false
ShowCitizenCrimeCount错误
AccessVehicleIndex假
SetVehicleAsStolen false
SetVehicleAsWanted false
SetVehicleAsFound false
SetVehicleNote false
每次我运行这个页面时,一切都很完美,但是我等了 3 秒钟(在这个时间之后,同一页面上还有一些其他更新,他们都没有访问任何这些变量或其他东西),然后在控制台中它们仍然显示好的,但是在页面中它们都被选中了,为什么
此外,我注意到有 thounds 的控制台日志这个 = thounds of rerenders。
Rest 可能很重要的代码:
onTablesChanged() {
this.allRanks = Array.from(this.db.Tables.Rank.values());
if (this.permissionsOfRank.length <= 0) {
this.permissionsOfRank = Array.from(this.db.Tables.PermissionOfRank.values());
}
}
permissionCategories(): string[] {
const res = [];
Array.from(this.db.Tables.Permission.values()).forEach((permission: Permission) => {
if (!res.includes(permission.Category)) {
res.push(permission.Category);
}
});
return res;
}
permissionsOfCategory(cat: string): Permission[] {
return Array.from(this.db.Tables.Permission.values())
.filter(c => c.Category === cat);
}
每 3 秒调用一次onTablesChanged
会导致此重新渲染,但它应该会导致 13 havePermission
调用,但会导致其中 99999999 次,为什么
Windows 10 Angular 8.3.26 Typescript 3.5.3 @angular/material 8.2.3
我在 FiveM 应用程序(GTA V)上运行了它——它只使用了铬。
为什么
通常在.html中使用function是个坏主意。 我想你的permissionCategories 和permissionOfCategory 会在表格发生变化时发生变化,那你可以在onTablesChanged 中进行管理。 所以你可以使用这个 function 来计算一个变量data
,它是一个 object 的数组。 每个 object 都有两个属性: category
和permissions
(最后一个是数组)。 所以:
data:any[] //<--declare a variable
onTablesChanged() {
this.allRanks = Array.from(this.db.Tables.Rank.values());
if (this.permissionsOfRank.length <= 0) {
this.permissionsOfRank = Array.from(this.db.Tables.PermissionOfRank.values());
}
//here calculate data in the way
data=this.permissionCategories().map(x=>({category:x,permissions:[]}))
//data is an array ob object with "category" and "permissions"
data.forEach(x=>{
//with each element of data
x.permissions=this.permissionsOfCategory(x.category)
//x.permisions is an array of Permision, but
//you create an object with "permision", the Permision and "selected"
.map(p=>({
permission:p,
selected:this.havePermission(x.category)
})
})
}
还有你的.html
<mat-selection-list>
<ng-container *ngFor="let cat of data">
<mat-divider></mat-divider>
<!--use cat.category-->
<div mat-subheader>{{ cat.category }}</div>
<!--use cat.permissions-->
<mat-list-option *ngFor="let permission of cat.permissions"
<!--use
[selected]="permission.selected"
>
{{ permission.permission.Name }}
</mat-list-option>
</ng-container>
</mat-selection-list>
我希望不要错过太多(我不检查代码),但请记住:这个想法是一次计算 - 使用 map 将数组转换为对象数组(一个属性是数组,另一个属性是值计算)代替使用复数 function 中的.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.