javascript-等待ajax结果绑定敲除模型

我有调用ajax GET的getGeneral函数.当ajax接收数据(json)时,它将根据给定的json创建KO模型,并返回创建的KO.

创建敲除模型并分配值后,应调用敲除applybindings.这是我的代码

定义GeneralModel和一些相关功能(在“ GeneralModel.js”内部):

var GeneralModel = function() {

   //for Now it is empty as data ar binded automatically from json
   // CountryName is one of the properties that is returned with json
} 

function getGeneral(pid) {
    $.ajax({
        url: "/api/general",
        contentType: "text/json",
        dataType: "json",
        type: "GET",
        data: { id: pid},
        success: function (item) {
            var p = new GeneralModel();
            p = ko.mapping.fromJS(item);
            return p;
        },
        error: function (data) {

        }
    });    
}

这是从另一个文件(GeneralTabl.html)调用的,它应该调用get函数和applyBindings来更新UI:

var PortfolioGeneral = getGeneral("@Model.Id");
ko.applyBindings(PortfolioGeneral, document.getElementById("pv-portfolio-general-tab"));

但是,在这种情况下,我会收到错误消息(CountryName未定义).这是因为applyBindings在ajax返回数据之前发生,所以我正在对具有未定义属性的空模型进行applyBindings.

从Json到Model的映射在这里发生,并分配值:
     p = ko.mapping.fromJS(item);

我也可以在所有字段中填写GeneralModel,但这不是必需的(我想):

  var GeneralModel = function() {    
      CountryName = ko.observable();
      ...
  } 

仍然会显示错误“ CountryName未定义”.

解决办法是什么?

1)我可以以某种方式在GeneralModel内移动getGeneral,因此获取数据将成为GeneralModel初始化的一部分吗?

要么

2)也许我应该以某种方式“等待ajax结果”,然后才applyBindings?

要么

我相信还有其他选择,我只是不太了解KO和纯JS.

注意:我完全理解这是因为Ajax是Async调用,所以问题是考虑到我有两个单独的文件并且需要从外部调用getGeneral并应返回一些变量的情况下,如何重组此代码.

解决方法:

尝试使用返回的Promise接口:

function getGeneral(pid) {
    return $.ajax({
        url: "/api/general",
        contentType: "text/json",
        dataType: "json",
        type: "GET",
        data: {
            id: pid
        }
    });
}

getGeneral("@Model.Id").done(function (item) {
    var p = new GeneralModel();
    p = ko.mapping.fromJS(item);
    ko.applyBindings(p, document.getElementById("pv-portfolio-general-tab"));
}).fail(function () {
    //handle error here
});

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...