0

我正在使用 Knockout JS 和 Durandal JS。我想从一个单独的 Js 文件中查询数据库并将数据绑定到 viewModel Js 文件中。

我有一个index.js文件并包含一个 listData 作为绑定到视图(index.html)的 observableArray。在 index.js 中,我正在调用一个函数来从另一个文件中获取数据:apiCall.js。在apiCall.js 中,我调用getJson方法从数据库中获取列表。现在,我应该如何将新列表绑定到 listData observableArray?由于 Ajax 是异步工作的,因此所有其他代码都会在 getJson 调用之前执行。此外,返回不会按预期工作。

我该怎么做?如果我从同一个 viewModel 文件本身(index.js)调用 getJson 或 ajax,它可以正常工作,因为我们可以轻松推送数据。是否有一个单独的文件只用于 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

您不能使用异步函数的返回值。使用回调。

Observables 是函数。这很方便,因为...

  • 因此它们可以用作回调
  • observable 期望的第一个参数是您要写入的数据
  • Ajaxdone()回调的第一个参数是来自服务器的数据

像这样:

// 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 回答