Angular *ngIf 检查映射中是否存在键
Angular *ngIf check if key exists in map
我的地图看起来像:
let mapToSearch =
{
'aaa': '123',
'bbb': '456'
}
我有一个变量:
let keyToFind = 'aaa';
在我的 HTML 模板中,在 Angular *ngIf
块中,我想检查 keyToFind
是否与此映射中的任何键匹配。
类似于 JS array.indexOf()
:
<ng-container *ngIf="mapToSearch.indexOf(keyToFind)">
Hello world
</ng-container>
模板中的地图可能会出现这种情况吗?
更新(包括解决方案)
感谢您的所有回答。您的所有答案都适用于使用对象文字(这是我的错误 - 我应该在问题中以不同方式声明地图)。
然而,对于 ES6 地图,我发现我可以在模板中使用 map.has(key)
。
使用 map.set()
声明地图:
let mapToSearch = new Map();
mapToSearch.set('aaa', '123'};
mapToSearch.set('bbb', '456'};
模板:
<ng-container *ngIf="mapToSearch.has(keyToFind)">
Hello World
</ng-container>
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/has
<ng-container *ngIf="mapToSearch.aaa === '123'">
Hello world
</ng-container>
如果 mapToSearch 没有定义 aaa,那么结果将为未定义值
如果使用以下简单方法,您可以实现。
<ng-container *ngIf="mapToSearch[keyToFind]">
Hello world
</ng-container>
因为你的数据是对象你可以使用 keyvalue 如果你正在使用 angular 6.1
<div *ngFor="let key of mapToSearch | keyvalue">
<ng-container *ngIf="key.key==keyToFind">
Hello world
</ng-container>
</div>
如果你的数据是数组那么你可以使用方法return数据
html
<ng-container *ngIf="KeyToFind(keyToFind)">
Hello world
</ng-container>
ts
KeyToFind(ktf){
return this.mapToSearch.map(data=>data[ktf]; }).indexOf(ktf);
}
您可以检查 属性 是否在 mapToSearch
中定义为 hasOwnProperty (see this stackblitz):
<ng-container *ngIf="mapToSearch.hasOwnProperty(keyToFind)">
Hello world
</ng-container>
如果 属性 存在,hasOwnProperty
将 return true
,即使关联的值为假。这与 mapToSearch[keyToFind]
不同,后者在以下情况下会 return false
:
prop: ""
prop: 0
您可以执行以下操作
<ng-container *ngIf="mapToSearch[keyToFind]"></ng-container>
或者,你可以在组件中写一个函数:
<ng-container *ngIf="isKeySet(mapToSearch, keyToFind)"></ng-container>
public isKeySet(obj: any, key: string): boolean {
return key in obj;
}
或者,你可以写一个管道:
<ng-container *ngIf="mapToSearch | isKeySet:keyToFind)"></ng-container>
@Pipe({name: 'isKeySet'})
export class IsKeySetPipe implements PipeTransform {
public transform(value: any, key?: string) {
return key in value;
}
}
当向 *ngIf 指令提供表达式而不是原语时,请注意性能损失。如果您提供一个表达式或函数,那么 Angular 的摘要循环将不得不每次都计算该表达式。要进行测试,请将 console.log() 语句添加到 ngIf 中的函数 - *ngIf="showMyElement()" - 并观察当您在应用程序中导航时它被调用了多少次。
Melindu 的回答非常好(对于你的情况我会这样做)- *ngIf="mapToSearch[keyToFind]"
养成的好习惯是在组件中设置一个布尔值,并在 collection/object 发生变化时更新该布尔值。通常,当您有更复杂的场景时,页面上不会有太多需要更新该布尔值的操作。因此,最好自己在组件中跟踪这些更改,而不是让 angular 在每个摘要中重新评估表达式或函数。
app.html
<div *ngIf="keyIsFound"></div>
component.ts
keyIsFound: boolean;
mapToSearch = {};
private checkKey(key: string) {
this.keyIsFound = this.mapToSearch[keyToFind]
}
// Collection changes
addToMap(newKey: string, newValue: any) {
this.mapToSearch[newKey] = newValue;
checkKey(newKey);
}
我的地图看起来像:
let mapToSearch =
{
'aaa': '123',
'bbb': '456'
}
我有一个变量:
let keyToFind = 'aaa';
在我的 HTML 模板中,在 Angular *ngIf
块中,我想检查 keyToFind
是否与此映射中的任何键匹配。
类似于 JS array.indexOf()
:
<ng-container *ngIf="mapToSearch.indexOf(keyToFind)">
Hello world
</ng-container>
模板中的地图可能会出现这种情况吗?
更新(包括解决方案)
感谢您的所有回答。您的所有答案都适用于使用对象文字(这是我的错误 - 我应该在问题中以不同方式声明地图)。
然而,对于 ES6 地图,我发现我可以在模板中使用 map.has(key)
。
使用 map.set()
声明地图:
let mapToSearch = new Map();
mapToSearch.set('aaa', '123'};
mapToSearch.set('bbb', '456'};
模板:
<ng-container *ngIf="mapToSearch.has(keyToFind)">
Hello World
</ng-container>
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/has
<ng-container *ngIf="mapToSearch.aaa === '123'">
Hello world
</ng-container>
如果 mapToSearch 没有定义 aaa,那么结果将为未定义值
如果使用以下简单方法,您可以实现。
<ng-container *ngIf="mapToSearch[keyToFind]">
Hello world
</ng-container>
因为你的数据是对象你可以使用 keyvalue 如果你正在使用 angular 6.1
<div *ngFor="let key of mapToSearch | keyvalue">
<ng-container *ngIf="key.key==keyToFind">
Hello world
</ng-container>
</div>
如果你的数据是数组那么你可以使用方法return数据
html
<ng-container *ngIf="KeyToFind(keyToFind)">
Hello world
</ng-container>
ts
KeyToFind(ktf){
return this.mapToSearch.map(data=>data[ktf]; }).indexOf(ktf);
}
您可以检查 属性 是否在 mapToSearch
中定义为 hasOwnProperty (see this stackblitz):
<ng-container *ngIf="mapToSearch.hasOwnProperty(keyToFind)">
Hello world
</ng-container>
如果 属性 存在,hasOwnProperty
将 return true
,即使关联的值为假。这与 mapToSearch[keyToFind]
不同,后者在以下情况下会 return false
:
prop: ""
prop: 0
您可以执行以下操作
<ng-container *ngIf="mapToSearch[keyToFind]"></ng-container>
或者,你可以在组件中写一个函数:
<ng-container *ngIf="isKeySet(mapToSearch, keyToFind)"></ng-container>
public isKeySet(obj: any, key: string): boolean {
return key in obj;
}
或者,你可以写一个管道:
<ng-container *ngIf="mapToSearch | isKeySet:keyToFind)"></ng-container>
@Pipe({name: 'isKeySet'})
export class IsKeySetPipe implements PipeTransform {
public transform(value: any, key?: string) {
return key in value;
}
}
当向 *ngIf 指令提供表达式而不是原语时,请注意性能损失。如果您提供一个表达式或函数,那么 Angular 的摘要循环将不得不每次都计算该表达式。要进行测试,请将 console.log() 语句添加到 ngIf 中的函数 - *ngIf="showMyElement()" - 并观察当您在应用程序中导航时它被调用了多少次。
Melindu 的回答非常好(对于你的情况我会这样做)- *ngIf="mapToSearch[keyToFind]"
养成的好习惯是在组件中设置一个布尔值,并在 collection/object 发生变化时更新该布尔值。通常,当您有更复杂的场景时,页面上不会有太多需要更新该布尔值的操作。因此,最好自己在组件中跟踪这些更改,而不是让 angular 在每个摘要中重新评估表达式或函数。
app.html
<div *ngIf="keyIsFound"></div>
component.ts
keyIsFound: boolean;
mapToSearch = {};
private checkKey(key: string) {
this.keyIsFound = this.mapToSearch[keyToFind]
}
// Collection changes
addToMap(newKey: string, newValue: any) {
this.mapToSearch[newKey] = newValue;
checkKey(newKey);
}