敲除映射(ko.mapping.fromJS())在异步$.ajax调用时不更新目标

敲除映射(ko.mapping.fromJS())在异步$.ajax调用时不更新目标,ajax,knockout.js,knockout-mapping-plugin,Ajax,Knockout.js,Knockout Mapping Plugin,我正在尝试使用ko.mapping将数据转换为viewmodel。结果来自对web服务的异步调用 简单视图: <div data-bind="with: myData"> <div data-bind="text: mapWidth"></div> <div data-bind="text: mapHeight"></div> <div data-bind="foreach: priceRanges">

我正在尝试使用ko.mapping将数据转换为viewmodel。结果来自对web服务的异步调用

简单视图:

<div data-bind="with: myData">
    <div data-bind="text: mapWidth"></div>
    <div data-bind="text: mapHeight"></div>
    <div data-bind="foreach: priceRanges">
    <div data-bind="text: title"></div>
</div>
当我同步运行时,它工作正常。但是,当我异步运行它时,它不会更新视图模型中的
myData

我在这里创作了一把小提琴:

我真的不想让ajax调用阻塞UI线程! 我做错了什么

谢谢, Jim

以下是解决方案:

我更改了行:

    self.myData = null;
致:

这还不是全部,我以前尝试过,但没有取得好的效果。除了使
myData
可见之外,我还必须改变它的更新方式。以下是新的
.done
方法:

    .done(function (d) {
        self.myData(ko.mapping.fromJS(d));
    })
所以,我需要做的是,像对待任何其他可见光一样对待这个场

你可以在这把新小提琴上看到它:

我希望这比我更有帮助。我在网上到处寻找这个问题的解决方案,但没有任何结果。就是这样

谢谢,
Jim

您可能有兴趣知道为什么异步真/假会绊倒您。答案是,当async为false时,在执行ko.applyBindings时,myData将包含一个值。当async为true时,myData将在ko.applyBindings执行后更新。因为myData不可观察,绑定将应用于null,并且在异步调用完成后knockout无法观察到更改。@Jim就是这样:)如果您要求,请将数据从构造函数中取出。它的清洁器用于在获取初始数据后绑定模型。
    self.myData = ko.observable();
    .done(function (d) {
        self.myData(ko.mapping.fromJS(d));
    })