ng-select:如何 select 具有相同标签但不同对象的多个项目
ng-select: how to select multiple items having same label but different object
我正在尝试修补 ng-select 下拉列表中的多个 selected 项目。我没有指定任何 bindValue,因此项目应该按对象绑定(如 https://www.npmjs.com/package/@ng-select/ng-select 中指定)
但是在尝试执行此操作时,项目不会根据对象 select 编辑,而是根据显示的标签进行编辑。同样只有第一个标签得到 selected.
示例:app.component.html
<form [formGroup]="group">
<div class="form-group" formGroupName="school">
<ng-select labelForId="school" placeholder="Select school" [items]="schools" formControlName="code"
bindLabel="displayLabel" multiple="true" groupBy="city">
</ng-select>
</div>
</form>
app.component.ts
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, FormControl, Validators } from '@angular/forms';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
group: FormGroup;
schools = [];
constructor(private fb: FormBuilder) { }
ngOnInit() {
this.initSchools();
const formModel = {
school: new FormGroup({
code: new FormControl(null, Validators.required)
})
}
this.group = this.fb.group(formModel);
this.group.patchValue({
school: {
code:
[
{
schoolId: 'SC003',
displayLabel: 'Test-3 school',
city: "City1"
},
{
schoolId: 'SC005',
displayLabel: 'Test-3 school',
city: "City5"
}
]
}
});
}
initSchools() {
this.schools.push(
{
schoolId: 'SC001',
displayLabel: 'Test-1 school',
city: "City1"
},
{
schoolId: 'SC002',
displayLabel: 'Test-2 school',
city: "City2"
},
{
schoolId: 'SC003',
displayLabel: 'Test-3 school',
city: "City3"
},
{
schoolId: 'SC004',
displayLabel: 'Test-4 school',
city: "City4"
},
{
schoolId: 'SC005',
displayLabel: 'Test-3 school',
city: "City5"
}
);
}
}
在上面的例子中只有 item
的对象
{
schoolId: 'SC003',
displayLabel: 'Test-3 school',
city: "City1"
},
获得 selected,
而下面的项目没有
{
schoolId: 'SC005',
displayLabel: 'Test-3 school',
city: "City5"
}
应该如何使这两个项目都select进入下拉列表(提供独特的对象)。
这里有什么遗漏吗?任何其他方式来实现这一目标。
这里有例子运行:https://stackblitz.com/edit/angular-szel64?file=src%2Fapp%2Fapp.component.ts
发现 ng-select 有一个 compareWith 选项,可以让你定义一个函数来比较对象。
使用它,您可以绑定对象,它会根据 compareWith 选项提供的功能得到 selected。
以下是我的更改,以防有人遇到同样的问题
app.component.html
<form [formGroup]="group">
<div class="form-group" formGroupName="school">
<ng-select labelForId="school" placeholder="Select school" [items]="schools" formControlName="code"
bindLabel="displayLabel" multiple="true" groupBy="city"
[compareWith]="compareFunction">
</ng-select>
</div>
</form>
app.component.ts
...
compareFunction(item, selected) {
// any logic to compare the objects and return true or false
return item.schoolId === selected.schoolId
}
...
我正在尝试修补 ng-select 下拉列表中的多个 selected 项目。我没有指定任何 bindValue,因此项目应该按对象绑定(如 https://www.npmjs.com/package/@ng-select/ng-select 中指定)
但是在尝试执行此操作时,项目不会根据对象 select 编辑,而是根据显示的标签进行编辑。同样只有第一个标签得到 selected.
示例:app.component.html
<form [formGroup]="group">
<div class="form-group" formGroupName="school">
<ng-select labelForId="school" placeholder="Select school" [items]="schools" formControlName="code"
bindLabel="displayLabel" multiple="true" groupBy="city">
</ng-select>
</div>
</form>
app.component.ts
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, FormControl, Validators } from '@angular/forms';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
group: FormGroup;
schools = [];
constructor(private fb: FormBuilder) { }
ngOnInit() {
this.initSchools();
const formModel = {
school: new FormGroup({
code: new FormControl(null, Validators.required)
})
}
this.group = this.fb.group(formModel);
this.group.patchValue({
school: {
code:
[
{
schoolId: 'SC003',
displayLabel: 'Test-3 school',
city: "City1"
},
{
schoolId: 'SC005',
displayLabel: 'Test-3 school',
city: "City5"
}
]
}
});
}
initSchools() {
this.schools.push(
{
schoolId: 'SC001',
displayLabel: 'Test-1 school',
city: "City1"
},
{
schoolId: 'SC002',
displayLabel: 'Test-2 school',
city: "City2"
},
{
schoolId: 'SC003',
displayLabel: 'Test-3 school',
city: "City3"
},
{
schoolId: 'SC004',
displayLabel: 'Test-4 school',
city: "City4"
},
{
schoolId: 'SC005',
displayLabel: 'Test-3 school',
city: "City5"
}
);
}
}
在上面的例子中只有 item
的对象 {
schoolId: 'SC003',
displayLabel: 'Test-3 school',
city: "City1"
},
获得 selected,
而下面的项目没有
{
schoolId: 'SC005',
displayLabel: 'Test-3 school',
city: "City5"
}
应该如何使这两个项目都select进入下拉列表(提供独特的对象)。 这里有什么遗漏吗?任何其他方式来实现这一目标。
这里有例子运行:https://stackblitz.com/edit/angular-szel64?file=src%2Fapp%2Fapp.component.ts
发现 ng-select 有一个 compareWith 选项,可以让你定义一个函数来比较对象。 使用它,您可以绑定对象,它会根据 compareWith 选项提供的功能得到 selected。
以下是我的更改,以防有人遇到同样的问题
app.component.html
<form [formGroup]="group">
<div class="form-group" formGroupName="school">
<ng-select labelForId="school" placeholder="Select school" [items]="schools" formControlName="code"
bindLabel="displayLabel" multiple="true" groupBy="city"
[compareWith]="compareFunction">
</ng-select>
</div>
</form>
app.component.ts
...
compareFunction(item, selected) {
// any logic to compare the objects and return true or false
return item.schoolId === selected.schoolId
}
...