Jquery 负载分离装置不工作

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

尝试从服务器加载带有json的ObservalArray,如下所示:

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
?您错误地获得了length
Insights
数组,它应该是
self.Insights().length
(带括号)。您是对的,Alexander,我的错……您不需要在Ajax调用中设置
contentType
dataType
。服务器通过发送正确的响应头来实现这一点,jQuery将自动获取它。“你能不能给我一个答案,让我接受?”?