2

我正在尝试调用返回 Json 的 Api。我正在尝试将此返回的数据放入一个淘汰赛可观察数组中。我的视图模型如下所示:

var adminData = $.getJSON("/api/administrators");
//console.log(adminData);

var viewModel = {
    administrators: ko.observableArray(adminData)
};

ko.applyBindings(viewModel);

请求通过,并且正在返回一个对象,其中包含 adminData 中的预期数据,但是当我尝试将其添加到 ko.observableArray 时,我在控制台中得到了这个:初始化可观察数组时传递的参数必须是一个数组。我不知道如何将这些数据放入数组中进行淘汰。

4

3 回答 3

10

$.getJSON 在异步。结果数据仅在回调中可用。它不可用,因为$.getJSON文档中的返回值从未提及返回值。

$.getJSON("/api/administrators", null, function(adminData, status, xhr){
    var viewModel = {
        administrators: ko.observableArray(adminData)
    };  
    ko.applyBindings(viewModel); 
});

如果您需要进行单独的 AJAX 调用,您应该使用jQuery.whenSee Wait until all jQuery Ajax requests are done?

$.when($.ajax("/api/administrators"), $.ajax("api/roles")).done(function(resp1, resp2){        
    ko.applyBindings({
        administrators: ko.observableArray(resp1[0]),
        roles: ko.observableArray(resp2[0]);
    }); 
});

这里有一些其他不太理想的解决方案,但它向您展示了幕后发生的事情。

如果您不介意请求相互等待

$.getJSON("/api/administrators", null, function(adminData){
    $.getJSON("/api/administrators", null, function(apiRoles){
        ko.applyBindings({
            administrators: ko.observableArray(adminData),
            roles: ko.observableArray(apiRoles);
        }); 
    });
});

如果您确实关心,它会更复杂,因为您需要跟踪请求是否完成

var ajaxAdminData, ajaxApiRoles
$.getJSON("/api/administrators", null, function(adminData, status, xhr){
    var ajaxAdminData = adminData;
    // If the other call finished, apply the bindings
    if (ajaxApiRoles) {
        applyBindings();
    }
});

$.getJSON("/api/administrators", null, function(apiRoles, status, xhr){
    ajaxApiRoles = apiRoles;
    // If the other call finished, apply the bindings
    if (ajaxAdminData) {
        applyBindings();
    }
});

function applyBindings() {
    ko.applyBindings({
        administrators: ko.observableArray(ajaxAdminData),
        roles: ko.observableArray(ajaxApiRoles);
    }); 
}
于 2013-04-16T19:31:32.287 回答
1

因为getJSON()是异步的!您不能将其视为同步方法。看看那个 console.log 行是什么,它会显示它失败的原因。

使用回调

$.getJSON("/api/administrators", function(adminData) {

    var viewModel = {
        administrators: ko.observableArray(adminData)
    };

    ko.applyBindings(viewModel);
}
于 2013-04-16T19:31:38.273 回答
0

在您的 $.getJSON 回调中,只需更新您的可观察数组,然后在该数组上调用 valueHasMutated(),如: administrators.valueHasMutated()

于 2014-05-29T15:41:11.227 回答