Javascript 在Knockout.js中异步应用绑定

Javascript 在Knockout.js中异步应用绑定,javascript,json,asynchronous,knockout.js,jquery-select2,Javascript,Json,Asynchronous,Knockout.js,Jquery Select2,我很难理解如何使用knockoutJS异步绑定级联Select2下拉字段 当要填充的数据在函数中是静态的时,代码可以很好地工作,但是当使用异步ajax调用时,代码不起作用,因为绑定是在收到响应之前执行的 由于我是一个knockout.js初学者,有人能引导我进入正确的方向或发现问题吗 击倒 构建数据 获取数据 buildData需要返回一个observable,以便在数据更改时自动更新绑定: function buildData() { var dataContainer = ko.obse

我很难理解如何使用knockoutJS异步绑定级联Select2下拉字段

当要填充的数据在函数中是静态的时,代码可以很好地工作,但是当使用异步ajax调用时,代码不起作用,因为绑定是在收到响应之前执行的

由于我是一个knockout.js初学者,有人能引导我进入正确的方向或发现问题吗

击倒

构建数据

获取数据

buildData需要返回一个observable,以便在数据更改时自动更新绑定:

function buildData() {
  var dataContainer = ko.observableArray([]);

  getData().then(function(newData) {
    console.log('step 4 - return result');
    dataContainer(newData);
  });

  return dataContainer; // Initially empty array
};

不过,我个人会先在viewModel中定义数组,然后在中写入数组,然后引用它。如果您使用基于类/实例的方法,这样您就可以使用此。。。但我想这是品味的问题。

谢谢你,这是一个非常有用的超级快速回复!你救了我的朋友!
function buildData() {
    var gotData = getData();

    return gotData.then(function() {
        console.log('step 4 - return result');
        returnData = gotData;
        return returnData;
    });
}
// Get all data from ajax call
function getData() {
    var data = { 'action': 'get_data' };
    var deferred = new jQuery.Deferred();

    return jQuery.post(ajaxurl, data, function(response) {
        // console.log(response);
        console.log('step 1 - parse ajax data');
        var obj = JSON.parse(response);
        console.log('step 2 - process received data');
        results = processData(obj);
    }).done(function() {
        console.log('step 3 - ajax parsing & processing data done');
        console.log(results);
        deferred.resolve(results);
        return deferred;
    }).fail(function() {
        console.log('fail');
    });
}
function buildData() {
  var dataContainer = ko.observableArray([]);

  getData().then(function(newData) {
    console.log('step 4 - return result');
    dataContainer(newData);
  });

  return dataContainer; // Initially empty array
};