Javascript 等待ajax结果绑定淘汰模型

Javascript 等待ajax结果绑定淘汰模型,javascript,jquery,ajax,json,knockout.js,Javascript,Jquery,Ajax,Json,Knockout.js,我有一个调用ajax GET的getGeneral函数。当ajax接收到数据json时,它根据给定的json创建KO模型并返回创建的KO 创建淘汰模型并分配值时,应调用淘汰applybindings。这是我的密码: 定义GeneralModel和GeneralModel.js中的一些相关函数: 这是从另一个文件GeneralTabl.html调用的,它应该调用get函数和applyBindings来更新UI: var PortfolioGeneral = getGeneral("@Model.I

我有一个调用ajax GET的getGeneral函数。当ajax接收到数据json时,它根据给定的json创建KO模型并返回创建的KO

创建淘汰模型并分配值时,应调用淘汰applybindings。这是我的密码:

定义GeneralModel和GeneralModel.js中的一些相关函数:

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

var PortfolioGeneral = getGeneral("@Model.Id");
ko.applyBindings(PortfolioGeneral, document.getElementById("pv-portfolio-general-tab"));
然而,在这个场景中,我得到了一个错误CountryName没有定义。这是因为applyBindings发生在ajax返回数据之前,所以我对具有未定义属性的空模型进行applyBindings

从Json到模型的映射发生在此处,并分配值: p=ko.mapping.fromJSitem

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

  var GeneralModel = function() {    
      CountryName = ko.observable();
      ...
  } 
它仍然会给出一个错误CountryName未定义

解决办法是什么

1我是否可以在GeneralModel中移动getGeneral,这样get数据将成为GeneralModel初始化的一部分

2也许我应该等待ajax结果,然后再应用绑定

我相信还有其他选择,我只是不太熟悉KO和purejs


注意:我完全理解这是因为Ajax是异步调用,所以问题是如何重新构造代码,考虑到我有两个独立的文件,我需要从外部调用getGeneral,它应该返回一些变量

尝试使用返回的承诺接口:

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
});

尝试使用返回的承诺接口:

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
});

记住,AJAX的第一个A表示异步。早在AJAX调用返回任何内容之前,getGeneral函数就已经退出了。是的<我完全理解这一点,我正在询问如何正确地重新构造它。在AJAX成功函数中移动applyBindings。重新构造您的模型,这样您就可以这样做。我不能进入ajax成功,因为它是单独的文件。记住,ajax的第一个A意味着异步。早在AJAX调用返回任何内容之前,getGeneral函数就已经退出了。是的<我完全理解这一点,我正在询问如何正确地重新构造它。在AJAX成功函数中移动applyBindings。重新构造您的模型,这样您就可以这样做。我不能进入ajax成功,因为它是单独的文件。