我正在使用一个knockout observable数组来填充下拉列表。如果我对数组值进行硬编码,则会填充下拉列表。但我现在正试图从数据库中获取数据。我正在使用JSON格式的javascript对象。我我正在访问javascript对象的单个属性,即;认证和我正在创建一个数组,我将其传递回一个脚本。但每次传回的值都是未定义的,而数组显示在控制台中。
转换为我正在使用的数组的代码是
var getCertifications = function () {
$.ajax({
type : "GET",
async : false,
url : "/Provider/GetCertifications",
dataType : "json",
success: function (data) {
var arrCertification = [];
$.each(data, function (i, item) {
arrCertification.push((item.Certification));
});
return arrCertification;
},
error : function () {
alert(" An error occurred.");
}
});
};
淘汰赛观察站的代码是
var certificates = getCertifications();
self.certificationArray = ko.observableArray(certificates);
,HTML是
<div class="form-group">
<label class="col-sm-2 control-label labelfont">Certification:</label>
<div class="col-sm-6">
<select class="form-control" id="certification" name="certification" data-bind="value: certification, options: certificationArray, optionsCaption: 'Select a Certification'">
</select>
</div>
</div>
有人可以指导我出错的地方。
答案 0 :(得分:1)
getCertifications()函数不返回任何内容。所有这一切都是开启ajax电话。
您需要使用某种回调或承诺对象来获取此调用的结果。使用回调,这看起来像:
var getCertifications = function (cb) {
$.ajax({
type : "GET",
async : false,
url : "/Provider/GetCertifications",
dataType : "json",
success: function (data) {
var arrCertification = [];
$.each(data, function (i, item) {
arrCertification.push((item.Certification));
});
cb(arrCertification);
},
error : function () {
alert(" An error occurred.");
}
});
};
getCertifications(function(certificates) {
self.certificationArray = ko.observableArray(certificates);
});
更好的模式是使用承诺。 $ .ajax方法返回一个promise。但是,回调方法是一个很好的起点,以便了解处理异步代码。