Javascript 在下拉选择上使用Formbuilder setvalue()时,未按预期工作
用于下拉选择时,Angular 2,4 formbuilder setvalue()未按预期工作 我有以下下拉列表,其中包含Github组织:Javascript 在下拉选择上使用Formbuilder setvalue()时,未按预期工作,javascript,angular,angular2-forms,Javascript,Angular,Angular2 Forms,用于下拉选择时,Angular 2,4 formbuilder setvalue()未按预期工作 我有以下下拉列表,其中包含Github组织: <select name="org" formControlName="organizations"> <option *ngFor="let org of organizations" [ngValue]="org">{{org.organization.login}}</option> </s
<select name="org" formControlName="organizations">
<option *ngFor="let org of organizations" [ngValue]="org">{{org.organization.login}}</option>
</select>
当我将值传递给setValue()
时,我希望选择相应的下拉选项。相反,我得到了一个空白选项。我还尝试了patchValue()
。不走运。
使用
标签上的属性与进行比较选择标签:
<select ... [compareWith]="compareByName">
举个小例子,我们想保存一个数字。请参阅[ngValue]=“org.id”和this.myForm.controls['organization'].setValue(value)
从'@angular/core'导入{Component,OnInit};
从'@angular/forms'导入{FormBuilder,FormControl,FormGroup};
界面组织{
id:编号;
名称:字符串;
}
@组成部分({
选择器:“应用程序选择”,
模板:`
{{org.name}
组织1
组织2
{{myForm.value | json}
`,
样式URL:['./select.component.css']
})
导出类SelectComponent实现OnInit{
组织:国际组织[];
myForm:FormGroup;
构造函数(私有fb:FormBuilder){}
恩戈尼尼特(){
这是一个组织=[
{id:1,名称:“org 1”},
{id:2,名称:“org2”},
{id:3,名称:“org 3”},
{id:4,名称:“org4”}
];
this.myForm=this.fb.group({
组织:1
})
}
setOrg(值:number){
this.myForm.controls['organization'].setValue(value);
}
}
如果我们想保存一个对象,请参见{{myForm.value | json},我们需要做一些更改。请注意,我们将[ngValue]=“org”,但setOrg()函数使用一个对象来生成setValue。而不是,它不是有效的setValue({id:1,name:'org1'})
从'@angular/core'导入{Component,OnInit};
....
模板:`
{{org.name}
....`
导出类SelectComponent实现OnInit{
...
恩戈尼尼特(){
这是一个组织=[
{id:1,名称:“org 1”},
....
];
this.myForm=this.fb.group({
组织:空
})
}
setOrg(值:number){
让organization=this.organizations.find(o=>o.id==value);
this.myForm.controls['organization'].setValue(组织);
}
我也遇到了同样的问题,并找到了Igor的答案。答案太模糊了,所以我仔细研究了一下。我最终找到了答案,Igor的答案是正确的,尽管缺乏细节。希望这能帮助未来任何人在下拉列表和对象模型上找到setValue()
通常,传递到setValue()
中的对象模型应与插入下拉选择器的对象相同。例如,如果类型为Organization
,则setValue
也应类型为Organization
。但是,不必共享完全相同的属性
要使setValue()
或patchValue()
使用对象模型(与某些基本类型相反),请使用Igor指出的[compareWith]
函数
从节点\u模块/@angular/material/select/typings/select.d.ts
:
compareWith是将选项值与选定值进行比较的函数。
第一个参数是来自选项的值。第二个参数是值
从所选内容。应返回布尔值
在html模板中
<select [compareWith]="compareOrgs" name="org" formControlName="organizations">
<option *ngFor="let org of organizations" [ngValue]="org">{{org.organization.login}}</option>
</select>
不要忘记调用setValue()
函数,例如在ngOnInit()
中调用,或者在回调函数中调用,如果它是异步的,并且您正在获取数据
例如,在上面OP代码的回调中
// "organization" is whatever object you're trying to patch on the dropdown
this.pipelineForm.get("organizations").setValue(organization)
因此,所有这一切的作用是,compareOrgs
函数将所选值(即传递到setValue
的对象,现在在compareOrgs
中标记为c2
)的值与每个选项的值(c1
)进行比较。具体而言,它比较所选值和选项值的orgId
属性。这就是FormControl
如何知道要在下拉列表中预选哪个值
您现在可以使用[ngValue]
访问对象
这是一个很好的资源,它帮助了我:使用compareWith
提供了一个比较器函数。我遇到了一个类似的问题,它不仅不适用于下拉列表,而且适用于任何类型的字段。我需要根据订阅更新我的表单值,它只是不适用于“setValue”。我不明白。请记住,正如您定义的那样,select的值是一个对象(您想说