0

Knockout JS と Durandal JS を使用しています。別の Js ファイルからデータベースにクエリを実行し、viewModel Js ファイルにデータをバインドしたいと考えています。

私はindex.jsファイルを持っていて、view(index.html)にバインドされたobservableArrayとしてlistDataを含んでいます。index.js では、別のファイルapiCall.jsからデータを取得する関数を呼び出しています。apiCall.js では、データベースからリストを取得するためにgetJsonメソッドを呼び出しています。では、新しいリストを listData observableArray にバインドするにはどうすればよいでしょうか? Ajax は非同期で動作するため、他のすべてのコードは getJson 呼び出しの前に実行されます。また、return は期待どおりに機能しません。

どうすればいいですか?getJson や ajax を同じ viewModel ファイル自体 (index.js) から呼び出すと、データを簡単にプッシュできるので問題なく動作します。ajax 呼び出し専用ののファイルを用意するのは良いことですか?

index.js

var activate = function () {
    var self = this;
    self.listData(apiCall.listData());
    ...}

apiCall.js

var listData = function () {    
    $.getJSON("/api/Clients", function (data) {
        return data; 
    }
}
4

1 に答える 1

0

非同期関数の戻り値は使用できません。コールバックを使用します。

オブザーバブルは関数です。便利だから…

  • したがって、コールバックとして機能できます
  • オブザーバブルが期待する最初の引数は、それに書き込みたいデータです
  • Ajax コールバックの最初の引数done()は、サーバーから取得したデータです

このような:

// index.js -------------------------------------------------------
var activate = function () {
    var self = this, apiCall = /* ... */;

    self.listData = ko.observableArray();

    apiCall.listData().done(self.listData);
}

// apiCall.js -----------------------------------------------------
var listData = function () {    
    return $.getJSON("/api/Clients"); 
}
于 2013-11-15T08:20:16.743 に答える