如果我使用* ngFor构建访问链,我无法访问异步管道提供的对象的属性。
在下面的示例中,假设测试行中的Parking
和下面的?.[filter.propName]
两行代表同一对象上的相同键。测试行将评估为true,但checked属性不会。为什么?如何使用* ngFor?
例如,如果{{(compModel | async)?.Parking?.Garage}} === true
我也希望{{(compModel | async)?.[filter.propName].instance}} === true
,但事实并非如此。
以下语法不起作用。我用它来演示预期的功能。
<div *ngFor="let filter of filters | async">
...
<fieldset class="filter-category-title">
<legend>{{filter.name}}</legend>
<label *ngFor="let instance of filter.options">
test: {{(compModel | async)?.Parking.instance}}
<input type="checkbox"
checked={{(compModel | async)?.[filter.propName].instance}}
(click)="amenityEmit({category: filter.propName, filter: instance, resetCategory: false})">
{{instance}}
</label>
</fieldset>
</div>
我从服务器获得的过滤数据格式如下。我使用它来构建比较模型,也在下面,这是我管理搜索结果页面状态的方式。 ([key: string]
始终是过滤器中的propName。
export interface Filter {
base: boolean,
filter: string,
propName: string,
unionType: string,
inputType: string,
options: {
options: string[],
sectionTitle: string
}[] | string[]
}
compModel接口:
export interface CompModel {
[key: string]: {
touched: boolean
unionType: string,
options: {
options: string[],
sectionTitle: string
}[] | string[],
updateSelf(x: CompModel, y: Action): void
}
}
答案 0 :(得分:1)
安全导航操作员?.
不适用于[]
。没有?[]
运算符,也没有?.[]
或.[]
运算符,因此无法使用。
你可以尝试
{{(compModel | async) && (compModel | async)[filter.propName].instance}} === true
否则你需要将一些代码移动到组件类
例如
this.compModel = someService.getSomeObservable()
.filter(val => !!val)
确保没有null
值