尝试从服务器加载带有json的observableArray,如下所示:
function InsightViewModel() {
var self = this;
self.Name = ko.observable("");
var insightData = {
Name: self.Name
};
self.insightData = ko.observable();
self.Insights = ko.observableArray([]);
$.ajax({
type: "GET",
url: '@Url.Action("GetIndexData", "Admin")',
contentType: "application/json",
dataType: "json",
data:{},
success: function (data) {
self.Insights(data);
alert(JSON.stringify(data) + "Array length " + self.Insights.length);
},
error: function (error) {
alert(error.status + " " + error.statusText);
}
});
};
var viewModel = new InsightViewModel();
ko.applyBindings(viewModel);
alert(viewModel.Insights.length);
我可以从服务器提醒json,它是有效的。但阵列是空的。
我试过这个,没有运气:
$(data).each(function (element) {
self.Insights.push(element);
});
没有经验的淘汰赛。有什么想法吗?
答案 0 :(得分:1)
你错误地得到长度Insights
observableArray,它应该是这样的:
self.Insights().length // with brackets
另一个问题,如@ haim770所述,在alert
之后调用ko.applyBindings(viewModel)
。很有可能,ajax请求尚未完成。
答案 1 :(得分:0)
数组为空的原因是因为默认情况下ajax是异步的。解决方法是在你的ajax调用中添加async:false,但这不是最好的实践。而不是添加async:false使用.done ...
function InsightViewModel() {
var self = this;
self.Name = ko.observable("");
var insightData = {
Name: self.Name
};
self.insightData = ko.observable();
self.Insights = ko.observableArray([]);
$.ajax({
type: "GET",
url: '@Url.Action("GetIndexData", "Admin")',
contentType: "application/json",
dataType: "json"
})
.done(function(data)
{
self.Insights(data);
});
};
var viewModel = new InsightViewModel();
ko.applyBindings(viewModel);
alert(viewModel.Insights.length());
希望这项工作......