$.getJSON
非同期で。結果データは、コールバックでのみ使用できます。$.getJSON
ドキュメントには戻り値について言及されていないため、使用できません。
$.getJSON("/api/administrators", null, function(adminData, status, xhr){
var viewModel = {
administrators: ko.observableArray(adminData)
};
ko.applyBindings(viewModel);
});
個別の AJAX 呼び出しを行う必要がある場合は、すべての jQuery Ajax 要求が完了するまで待機jQuery.when
するを参照してください。
$.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);
});
}