Load Knockout observableArray不工作

时间:2014-02-19 08:06:58

标签: jquery json asp.net-mvc-4 knockout.js

尝试从服务器加载带有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);
});

没有经验的淘汰赛。有什么想法吗?

2 个答案:

答案 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());

希望这项工作......