Javascript knockout.js中的级联下拉列表
我正在尝试从下拉列表填充另一个下拉列表,我不断收到错误“TypeError:无法处理绑定”值:function(){return CompanySelected}”和“400(错误请求)”。选择保险公司时必须填充保险单。这是下面的代码Javascript knockout.js中的级联下拉列表,javascript,knockout.js,asp.net-mvc-5,Javascript,Knockout.js,Asp.net Mvc 5,我正在尝试从下拉列表填充另一个下拉列表,我不断收到错误“TypeError:无法处理绑定”值:function(){return CompanySelected}”和“400(错误请求)”。选择保险公司时必须填充保险单。这是下面的代码 self.InsuranceCompanyId = ko.observable(); self._companySelected= ko.observable(null); self.CompanySelected = ko.computed({
self.InsuranceCompanyId = ko.observable();
self._companySelected= ko.observable(null);
self.CompanySelected = ko.computed({
read: function () {return this._companySelected() },
write: function (value) {
$.ajax({
url: baseUrl + 'api/Transaction/LoadInsurancePolicies/' +
value.InsuranceCompanyId,
type: 'GET',
headers: { 'Access-Control-Allow-Origin': '*' },
dataType: 'json',
success: function (data) {
if (data.Successfull == 1)
{
self.AllPolicies(data.Model); } },
error: function (request, error) {
}
});
this._companySelected(value);
},
owner: this
});
self.AllInsuranceCompanies = ko.observableArray([]);
self.AllPolicies = ko.observableArray([]);
self.LoadInsuranceCompanies = function () {
$.ajax({
url: baseUrl + 'api/Transaction/LoadInsuranceCompanies',
type: 'GET',
headers: { 'Access-Control-Allow-Origin': '*' },
dataType: 'json',
success: function (data) {
// console.log(data);
if (data.Successfull == 1) {
self.AllInsuranceCompanies(data.Model);
console.log(data);
}
},
error: function (request, error) {
console.log(error);
}
});
}
self.LoadInsuranceCompanies();
this is my view
<div class="form-group" data-bind="visible:(InputOption()==0)">
<label for="InputTxt" class="control-label col-md-4">Insurance
Company</label>
<div class="col-md-8">
<select data-bind="options: AllInsuranceCompanies,
optionsText: 'Name',
optionsValue:'Id',
optionsCaption: 'Choose...',
value:CompanySelected,
valueUpdate:'change'" class="form-control">
</select>
</div>
</div>
<div class="form-group" data-bind="visible: (InputOption()==0)">
<label for="InputTxt" class="control-label col-md-
4">InsurancePolicy</label>
<div class="col-md-8">
<select data-bind="options: AllPolicies,
optionsText: 'Name',
optionsValue:'Id',
value: selectedPolicy,
optionsCaption: 'Choose...'" class="form-control">
</select>
</div>
</div>
self.InsuranceCompanyId=ko.observable();
self._companySelected=ko.可观测(空);
self.CompanySelected=ko.computed({
read:function(){返回此._companySelected()},
写入:函数(值){
$.ajax({
url:baseUrl+“api/Transaction/LoadInsurancePolicys/”+
value.InsuranceCompanyId,
键入:“GET”,
头文件:{“访问控制允许源文件”:“*”},
数据类型:“json”,
成功:功能(数据){
如果(data.Successfull==1)
{
self.AllPolicies(data.Model);},
错误:函数(请求,错误){
}
});
本公司已选择(价值);
},
业主:这个
});
自联保险公司=ko.可观察公司([]);
self.AllPolicies=ko.observearray([]);
self.loadInsuranceCompanys=函数(){
$.ajax({
url:baseUrl+“api/Transaction/LoadInsuranceCompanys”,
键入:“GET”,
头文件:{“访问控制允许源文件”:“*”},
数据类型:“json”,
成功:功能(数据){
//控制台日志(数据);
如果(data.Successfull==1){
联合保险公司(数据模型);
控制台日志(数据);
}
},
错误:函数(请求、错误){
console.log(错误);
}
});
}
self.LoadInsuranceCompanies();
这是我的看法
保险
单位
保险单
以下可能是代码中的问题
self.CompanySelected
是在self.AllPolicies
之前定义的。这将导致运行时错误,因为定义时会自动运行ko.computed
。这是基于淘汰文档的。解决方案:尝试在所有ko.computed
之前定义所有ko.observeable
,或至少放置self.AllPolicys
在选择self.Company之前ko.computed
自动运行,并且self.CompanySelected
的值为undefined
,因此您的api调用中还将有一个undefined
保险公司ID,这将导致错误的请求400。解决方案:在调用api之前尝试添加一个防护。如果(值){……}optionsValue:'Id'
。这将导致knockout尝试在您的模型中查找可能不存在的Id
属性。解决方案:从绑定中删除optionsValue:'Id'
,以便更改选项时的值将是模型对象本身,而不仅仅是Id代码>
注意:我刚刚用
setTimeout
替换了您的api调用,因为我没有访问它们的权限。不要担心这一部分。以下可能是您代码中的问题
self.CompanySelected
是在self.AllPolicies
之前定义的。这将导致运行时错误,因为定义时会自动运行ko.computed
。这是基于淘汰文档的。解决方案:尝试在所有ko.computed
之前定义所有ko.observeable
,或至少放置self.AllPolicys
在选择self.Company之前ko.computed
自动运行,并且self.CompanySelected
的值为undefined
,因此您的api调用中还将有一个undefined
保险公司ID,这将导致错误的请求400。解决方案:在调用api之前尝试添加一个防护。如果(值){……}optionsValue:'Id'
。这将导致knockout尝试在您的模型中查找可能不存在的Id
属性。解决方案:从绑定中删除optionsValue:'Id'
,以便更改选项时的值将是模型对象本身,而不仅仅是Id代码>
注意:我刚刚用
setTimeout
替换了您的api调用,因为我没有访问权限。不要担心这一部分。您的解决方案给了我一个想法。我传递了一个函数(值),该值将是所选Id,将其作为参数添加到api中,它会得到结果
self.insuranceCompanyId = ko.observable('');
self.selectedPolicy = ko.observable();
self._companySelected = ko.observable();
self.CompanySelected = ko.pureComputed({
read: function () {
return this._companySelected()
},
write: function (value) {
console.log("inside write", value)
if (value) {
console.log('data');
$.ajax({
url: baseUrl + "api/Transaction/LoadInsurancePolicies/" +
value,
type: 'GET',
headers: { 'Access-Control-Allow-Origin': '*' },
dataType: 'json',
success: function (data) {
if (data.Successfull == 1) {
self.AllPolicies(data.Model);
console.log(value);
}
},
error: function (request, error) {
console.log(error);
}
});
this._companySelected(value);
}
},
owner: this
});
self.LoadInsuranceCompanies();
您的解决方案给了我一个想法。我传递了一个函数(值),该值将是所选Id,将其作为参数添加到api中,它将得到结果
self.insuranceCompanyId = ko.observable('');
self.selectedPolicy = ko.observable();
self._companySelected = ko.observable();
self.CompanySelected = ko.pureComputed({
read: function () {
return this._companySelected()
},
write: function (value) {
console.log("inside write", value)
if (value) {
console.log('data');
$.ajax({
url: baseUrl + "api/Transaction/LoadInsurancePolicies/" +
value,
type: 'GET',
headers: { 'Access-Control-Allow-Origin': '*' },
dataType: 'json',
success: function (data) {
if (data.Successfull == 1) {
self.AllPolicies(data.Model);
console.log(value);
}
},
error: function (request, error) {
console.log(error);
}
});
this._companySelected(value);
}
},
owner: this
});
self.LoadInsuranceCompanies();
您是否尝试使用
\U companySelected
您的意思是我应该在视图的值上使用它。将companySelected替换为companySelected??您是否尝试使用\U companySelected
您的意思是我应该在视图的值上使用它。将companySelected替换为companySelected??感谢您对上述代码的帮助,所有策略都是结果lt set必须加载到另一个下拉列表中,但api一直告诉我InsuranceCompanyId未定义。感谢您对上述代码的帮助,AllPolicys是必须加载到另一个下拉列表中的结果集,但api一直告诉我InsuranceCompanyId未定义(这是数据库中的一列,外键)。所有保单都有属性“InsuranceCompanyId”,但AllinsuranceCompanys有属性“Id”。因此,当加载所有“AllinsuranceCompanys”并单击时,必须根据AllinsuranceCompanys的结果加载所有保单。感谢您的帮助