当前位置: 首页 > 面试题库 >

等待ajax结果绑定敲除模型

戴化
2023-03-14
问题内容

我有getGeneral调用ajax GET的函数。当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)我可以以某种方式进入getGeneral内部GeneralModel,因此获取数据将成为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
});


 类似资料:
  • 我正在使用模板绑定来呈现一组单选按钮。元素上还有一个css绑定。 单击单选按钮时,viewmodel http://jsfiddle.net/d3YJc/1/

  • 我试图访问位于下的属性。所以基本上是一个数组,我要访问属性。 我得到以下错误。 无法处理绑定“text:function(){return process().parent[0].Id}” 无法读取未定义的属性“Id” 我尝试了以下不起作用的方法: 请帮助我如何访问ID。

  • 我使用Knockout。我需要建立一些功能。我从来没用过击倒。 每个视图都有一个视图模型,该模型通过从主视图模型调用。 属性在初始化开始时初始化,并在视图中使用,没有问题。例如: 这样初始化,并在无容器绑定中正确使用,如下所示: 因此,我以相同的位置/方式初始化我的新属性: 并按如下方式使用: 并得到这个错误: 击倒。js:72未捕获引用错误:无法处理绑定“foreach:function(){r

  • 我试图弄清楚如何使用knockout从html中添加和删除类。 应该发生的是,当我点击卡车时,按钮应该更新为btn红色,而car按钮应该删除btn红色。 我可以看到事件绑定正在工作,因为触发了警报并返回了正确的值,但我无法更新视图。 我编写了一个非常简单的JSFIDLE。net/N8GBB/11/(出于某种原因,stackoverflow不允许我发布链接)以下是我在JSFIDLE中使用的代码

  • 问题内容: 我正在寻找一种方法来异步执行go中的两个函数,该函数返回不同的结果和错误,等待它们完成并打印两个结果。另外,如果一个函数返回错误,我不想等待另一个函数,只打印错误。例如,我具有以下功能: 这里https://play.golang.org/p/-8StYapmlg是我是如何实现它,但是它有太多的代码,我想。可以通过使用interface {}来简化它,但是我不想这样。我想要更简单的东西

  • 我们如何等待IWebElement(重新)连接到DOM?我的场景是这样的,我从dropdown1中选择一个值,然后单击dropdown2上的数据绑定。所以当我的测试像从Dd1中选择“foo”,然后从Dd2中选择“bar”- 但是我真的不想把定位器字符串(“foo”)带到我的测试逻辑中,因为它似乎破坏了使用页面对象模型的意义。使用页面对象模型时,我已经有了IWebElement实例 那么,您知道隐式