Jquery 负载分离装置不工作
尝试从服务器加载带有json的ObservalArray,如下所示:Jquery 负载分离装置不工作,jquery,json,asp.net-mvc-4,knockout.js,Jquery,Json,Asp.net Mvc 4,Knockout.js,尝试从服务器加载带有json的ObservalArray,如下所示: function InsightViewModel() { var self = this; self.Name = ko.observable(""); var insightData = { Name: self.Name }; self.insightData = ko.observable(); self.Insights = ko.observabl
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);
self.Insights().length // with brackets
我可以从服务器发出json警报,它是有效的。但是数组是空的
我试过这个,但运气不好:
$(data).each(function (element) {
self.Insights.push(element);
});
没有击倒对手的经验。有什么想法吗?你没有正确地获得长度
洞察
可观察性雷,应该是这样的:
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);
self.Insights().length // with brackets
另一个问题,如@haim770所述,是在
ko.applyBindings(viewModel)
之后调用alert
。ajax请求很有可能尚未完成。之所以数组为空,是因为默认情况下ajax是异步的。解决方法是在ajax调用中添加async:false,但这不是最好的做法。而不是添加异步:false use.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());
希望这项工作…
alert(viewModel.Insights.length)
可能在调用$.ajax.suces
回调之前运行。如果您尝试ko.dataFor(document.body).Insights().length
?您错误地获得了lengthInsights
数组,它应该是self.Insights().length
(带括号)。您是对的,Alexander,我的错……您不需要在Ajax调用中设置contentType
和dataType
。服务器通过发送正确的响应头来实现这一点,jQuery将自动获取它。“你能不能给我一个答案,让我接受?”?