Angular 在ng2-select2指令中绑定反应表单formControlName
在我的Angular 在ng2-select2指令中绑定反应表单formControlName,angular,typescript,Angular,Typescript,在我的angular5项目中,我使用反应式表单来处理表单。在这个表单中,我使用ng2-select2创建select2下拉列表,但是当我试图将formControlName绑定到指令中时,它会给我带来错误 错误:名称为“公民身份\u id”的表单控件没有值访问器 以下是.ts文件中的ngOnInit函数: ngOnInit() { this.jobId = this.route.snapshot.queryParams.jobId; this.detailForm = new F
angular5
项目中,我使用反应式表单来处理表单。在这个表单中,我使用ng2-select2
创建select2下拉列表,但是当我试图将formControlName
绑定到
指令中时,它会给我带来错误
错误:名称为“公民身份\u id”的表单控件没有值访问器
以下是.ts文件中的ngOnInit函数:
ngOnInit() {
this.jobId = this.route.snapshot.queryParams.jobId;
this.detailForm = new FormGroup({
date_of_birth: new FormControl(null, Validators.required),
gender: new FormControl('', Validators.required),
marital_status: new FormControl('', Validators.required),
npwp_family_status_id: new FormControl('', Validators.required),
citizenship_id: new FormControl('', Validators.required),
});
this.ajaxOptions = {
url: API_URL + '/generate-json',
dataType: 'json',
delay: 250,
data: function (params) {
return {
s: params.term,
page: params.page,
model_name: 'country'
};
},
type: 'POST',
processResults: function (res) {
let data = $.map(res.results, function (obj) {
if (obj.overwriteId)
obj.id = obj.overwriteId;
return obj;
});
return {
results: data,
pagination: res.pagination
};
}
};
this.options = {
ajax: this.ajaxOptions,
// theme: 'bootstrap',
width: '100%',
allowClear: true,
placeholder: 'Select...',
language: {
'errorLoading': function () {
return 'Searching…';
}
},
templateResult: function (data) {
return data.create === true ? data.text + ' <b style="color: lightgreen;">(create new)</b>' : data.text;
},
templateSelection: function (data) {
return data.create === true ? data.text + ' <b class="text-success">(create new)</b>' : data.text;
},
escapeMarkup: function (markup) {
return markup;
},
createTag: function (params) {
var term = $.trim(params.term);
return term ? {
id: term,
text: term,
create: true
} : null;
},
insertTag: function (data, tag) {
var found = false;
$.each(data, function (i, e) {
if (e.text.toLowerCase() == tag.text.toLowerCase())
found = true;
});
if (!found)
data.unshift(tag);
},
minimumInputLength: 2
};
}
ngOnInit(){
this.jobId=this.route.snapshot.queryParams.jobId;
this.detailForm=新表单组({
出生日期:新FormControl(空,需要验证器),
性别:新FormControl(“”,需要验证器),
婚姻状况:新FormControl(“”,需要验证器),
npwp_系列_状态_id:新FormControl(“”,需要验证程序),
公民身份:新的FormControl(“”,需要验证器),
});
this.ajaxOptions={
url:API_url+'/generate json',
数据类型:“json”,
延误:250,
数据:函数(参数){
返回{
s:params.term,
页码:params.page,
型号名称:“国家”
};
},
键入:“POST”,
processResults:函数(res){
让数据=$.map(res.results,function(obj)){
if(对象覆盖ID)
obj.id=obj.id;
返回obj;
});
返回{
结果:数据,
分页:res.pagination
};
}
};
此选项={
ajax:this.ajaxOptions,
//主题:“引导”,
宽度:“100%”,
allowClear:是的,
占位符:“选择…”,
语言:{
“errorLoading”:函数(){
返回“搜索…”;
}
},
templateResult:函数(数据){
返回data.create==true?data.text+'(新建)':data.text;
},
模板选择:函数(数据){
返回data.create==true?data.text+'(新建)':data.text;
},
转义标记:函数(标记){
返回标记;
},
createTag:函数(参数){
变量项=$.trim(参数项);
回报期{
id:术语,
案文:任期,
创建:true
}:null;
},
insertTag:函数(数据、标记){
var=false;
$。每个(数据、功能(即){
if(e.text.toLowerCase()==tag.text.toLowerCase())
发现=真;
});
如果(!找到)
数据反移位(tag);
},
最小输入长度:2
};
}
这是我的.html文件:
<select2 [options]="options" formControlName="citizenship_id"></select2>
问题在于您的自定义组件
选择2
。您的组件似乎没有实现ControlValueAccessor
。只需确保您的组件实现了ControlValueAccessor
参见简单示例-
请参阅这篇漂亮的文章-,虽然Select2不能以本机方式处理ReactiveForms,但这里有一个很好的解决方案: 创建绑定到formControlName的新隐藏输入。每当更改select2的值时,也要更新隐藏输入的值 如果您从API获得响应,并且希望预先选择该值,请使用具有响应中所选值的数组变量(例如:
[{id:1,text:'selected value'}]
,然后在select2指令中,设置[value]=“{selected\u value\u id}”
)
要感谢OP@DennyRustandi和@SunilSingh在评论中提供了这些信息。您是否在html中定义了
?@SunilSingh我确实定义了
。问题是,我可以获取其他输入,但这是select2输入。您是否找到此@DennyRustandi@Asif的解决方案?如果我创建一个绑定到formControlName的新隐藏输入。每当我更改select2的值时,我都会将隐藏输入的值更新为well@Asif比如你从API得到响应,你想预先选择值?在我的例子中,我有一个数组变量,它包含了我从响应中选择的值,例如:[{id:1,text:'selected value'}]
,然后在select2指令中设置[value]=“{selected\u value\u id}”
那么,在开发人员实现ControlValueAccessor
之前,ng2-select2将不会与reactiveForm功能一起工作,这公平吗?