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 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);
    }); 
}
于 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() を呼び出します。

于 2014-05-29T15:41:11.227 に答える