Angular ngIf 使用父复选框检查条件
Angular ngIf using parent checkbox checked condition
我有点被我的问题困住了。我正在处理这样的视图:
我正在从 API 获取数据,因此我将有多个选项和子选项。但是我希望子选项仅在选中父复选框时出现。我尝试使用 *ngIf:
<ul *ngFor="let job of jobs; let i = index">
<input type="checkbox" id="{{i}}" value="{{job.name}}"><label
for="{{i}}">{{job.name}}</label>
<ul *ngIf="CONDITION HERE">
<li *ngFor="let child of job.children"><label><input type="checkbox">
{{child.name}}</label></li>
<li *ngFor="let child of job.children"><label><input type="checkbox">
{{child.name}}</label></li>
</ul>
</ul>
但我无法确定我可以使用什么条件。有解决这个问题的简单方法吗?
@edit 让我澄清一下。我可能有多个这样的选择:
使用标志是行不通的,因为每个父选项都必须使用唯一的布尔变量。
在您的模型中添加一个选中的 属性,然后根据是否选中,显示子复选框。
Ex(假设您的模型名为 Job)
export class Job {
isChecked: boolean = false;
}
那么你的 ngIf 将是 *ngIf="job.isChecked"
<input [checked]="checkedMain" type="checkbox" id="{{i}}" value="{{job.name}}"><label
for="{{i}}">{{job.name}}</label>
<ul *ngIf="checkedMain">
<li *ngFor="let child of job.children"><label><input type="checkbox">
{{child.name}}</label></li>
<li *ngFor="let child of job.children"><label><input type="checkbox">
{{child.name}}</label></li>
</ul>
NgIf
A structural directive that conditionally includes a template based on
the value of an expression coerced to Boolean.
您可以只检查工作是否存在。
<ul *ngIf="job"> //should do the job for you as it will be coerced to true if job exists.
您可以借助 模板引用变量 来实现。为所有重复的父输入复选框元素分配一个模板变量。
使用此变量检查复选框 (checked/unchecked) 的状态,并基于此 show/hide 子项。
请注意,您还必须使用
(change)="true"
用于父复选框。如果没有这个,复选框的 checked/unchecked 属性 将不会改变。
像这样修改您的模板:
<ul *ngFor="let job of jobs; let i = index">
<input type="checkbox" id="{{ i }}" value="{{ job.name }}" (change)="true" #checkBox/><label
for="{{ i }}"
>{{ job.name }}</label
>
<ul *ngIf="checkBox.checked">
<li *ngFor="let child of job.children">
<label><input type="checkbox" /> {{ child.name }}</label>
</li>
<li *ngFor="let child of job.children">
<label><input type="checkbox" /> {{ child.name }}</label>
</li>
</ul>
</ul>
Stackblitz:https://stackblitz.com/edit/angular-x3coln?file=src/app/app.component.html
实现此目的的理想方法是保留一个 isChecked 属性 来跟踪每个选项的复选框状态。
<div>
<ul *ngFor="let option of options; let i = index">
<input type="checkbox" id="{{ i }}" [(ngModel)]="option.isChecked" /><label
for="{{ i }}"
>{{ option.name }}</label
>
<ul *ngIf="option.isChecked">
<li *ngFor="let subOption of option.subOptions">
<label>{{ subOption }}</label>
</li>
</ul>
</ul>
</div>
options = [{ name: 'Type1', subOptions: [1, 2, 3], isChecked: false }];
方法二:如果不想修改列表jobs/options
<div>
<ul *ngFor="let option of options; let i = index">
<input type="checkbox" id="{{ i }}" [(ngModel)]="state[option.name]" />
<label
for="{{ i }}"
>{{ option.name }}</label
>
<ul *ngIf="state[option.name]">
<li *ngFor="let subOption of option.subOptions">
<label>{{ subOption }}</label>
</li>
</ul>
</ul>
</div>
options = [{ name: 'Type1', subOptions: [1, 2, 3]}];
state = {};
你可以这样做
假设您的列表如下所示 API
this.list = [
{
id: 1,
title: 'parent1',
checked: false,
children:["A","B","C"]
},
{
id: 2,
title: 'parent2',
checked: false,
children:["A","B","C"]
},
{
id: 3,
title: 'parent3',
checked: false,
children:["A","B","C"]
}
]
您的 html 代码应该类似于下面 hide/unhide 基于 parent 状态的 children。
<ul *ngFor="let item of list">
<input type="checkbox" [(ngModel)]="item.checked"/>{{item.title}}
<ng-template [ngIf]="item.checked">
<li *ngFor="let item1 of item.children">
<input type="checkbox" >{{item1}}
</li>
</ng-template>
</ul>
我有点被我的问题困住了。我正在处理这样的视图:
我正在从 API 获取数据,因此我将有多个选项和子选项。但是我希望子选项仅在选中父复选框时出现。我尝试使用 *ngIf:
<ul *ngFor="let job of jobs; let i = index">
<input type="checkbox" id="{{i}}" value="{{job.name}}"><label
for="{{i}}">{{job.name}}</label>
<ul *ngIf="CONDITION HERE">
<li *ngFor="let child of job.children"><label><input type="checkbox">
{{child.name}}</label></li>
<li *ngFor="let child of job.children"><label><input type="checkbox">
{{child.name}}</label></li>
</ul>
</ul>
但我无法确定我可以使用什么条件。有解决这个问题的简单方法吗?
@edit 让我澄清一下。我可能有多个这样的选择:
使用标志是行不通的,因为每个父选项都必须使用唯一的布尔变量。
在您的模型中添加一个选中的 属性,然后根据是否选中,显示子复选框。
Ex(假设您的模型名为 Job)
export class Job {
isChecked: boolean = false;
}
那么你的 ngIf 将是 *ngIf="job.isChecked"
<input [checked]="checkedMain" type="checkbox" id="{{i}}" value="{{job.name}}"><label
for="{{i}}">{{job.name}}</label>
<ul *ngIf="checkedMain">
<li *ngFor="let child of job.children"><label><input type="checkbox">
{{child.name}}</label></li>
<li *ngFor="let child of job.children"><label><input type="checkbox">
{{child.name}}</label></li>
</ul>
NgIf
A structural directive that conditionally includes a template based on the value of an expression coerced to Boolean.
您可以只检查工作是否存在。
<ul *ngIf="job"> //should do the job for you as it will be coerced to true if job exists.
您可以借助 模板引用变量 来实现。为所有重复的父输入复选框元素分配一个模板变量。
使用此变量检查复选框 (checked/unchecked) 的状态,并基于此 show/hide 子项。
请注意,您还必须使用
(change)="true"
用于父复选框。如果没有这个,复选框的 checked/unchecked 属性 将不会改变。
像这样修改您的模板:
<ul *ngFor="let job of jobs; let i = index">
<input type="checkbox" id="{{ i }}" value="{{ job.name }}" (change)="true" #checkBox/><label
for="{{ i }}"
>{{ job.name }}</label
>
<ul *ngIf="checkBox.checked">
<li *ngFor="let child of job.children">
<label><input type="checkbox" /> {{ child.name }}</label>
</li>
<li *ngFor="let child of job.children">
<label><input type="checkbox" /> {{ child.name }}</label>
</li>
</ul>
</ul>
Stackblitz:https://stackblitz.com/edit/angular-x3coln?file=src/app/app.component.html
实现此目的的理想方法是保留一个 isChecked 属性 来跟踪每个选项的复选框状态。
<div>
<ul *ngFor="let option of options; let i = index">
<input type="checkbox" id="{{ i }}" [(ngModel)]="option.isChecked" /><label
for="{{ i }}"
>{{ option.name }}</label
>
<ul *ngIf="option.isChecked">
<li *ngFor="let subOption of option.subOptions">
<label>{{ subOption }}</label>
</li>
</ul>
</ul>
</div>
options = [{ name: 'Type1', subOptions: [1, 2, 3], isChecked: false }];
方法二:如果不想修改列表jobs/options
<div>
<ul *ngFor="let option of options; let i = index">
<input type="checkbox" id="{{ i }}" [(ngModel)]="state[option.name]" />
<label
for="{{ i }}"
>{{ option.name }}</label
>
<ul *ngIf="state[option.name]">
<li *ngFor="let subOption of option.subOptions">
<label>{{ subOption }}</label>
</li>
</ul>
</ul>
</div>
options = [{ name: 'Type1', subOptions: [1, 2, 3]}];
state = {};
你可以这样做
假设您的列表如下所示 API
this.list = [
{
id: 1,
title: 'parent1',
checked: false,
children:["A","B","C"]
},
{
id: 2,
title: 'parent2',
checked: false,
children:["A","B","C"]
},
{
id: 3,
title: 'parent3',
checked: false,
children:["A","B","C"]
}
]
您的 html 代码应该类似于下面 hide/unhide 基于 parent 状态的 children。
<ul *ngFor="let item of list">
<input type="checkbox" [(ngModel)]="item.checked"/>{{item.title}}
<ng-template [ngIf]="item.checked">
<li *ngFor="let item1 of item.children">
<input type="checkbox" >{{item1}}
</li>
</ng-template>
</ul>