当异步$ .ajax调用时,knockout映射(ko.mapping.fromJS())不更新目标

时间:2014-06-05 01:18:48

标签: 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">
    <div data-bind="text: title"></div>
</div>

AND视图模型如下:

var ViewModel = function() {
    var self = this;

    self.myData = null;

    var data = {
        action: 'GetPricePoints',
        type: 'who cares'
    };

    $.ajax({
        url: 'http://cdt.lotamore.com/api/imap',
        data: { "": JSON.stringify(data) },
        //async: false, // works!
        async: true, // doesn't work!!!!!
        type: 'post'
    })
    .done(function (data) {
        self.myData = ko.mapping.fromJS(data);
    })
    .error(function (data) {
        alertError(data);
    })
    .always(function () {
    });
};

当我同步运行时,工作正常。但是,当我以异步方式运行它时,它不会更新视图模型中的myData

我在这里创造了一个小提琴: http://jsfiddle.net/jgergen/jF9pm/20/

我真的不想做阻止UI线程的ajax调用! 我在这里做错了什么?

谢谢, 吉姆

1 个答案:

答案 0 :(得分:1)

以下是解决方案:

我改变了这句话:

    self.myData = null;

为:

    self.myData = ko.observable();

这不是全部,我之前尝试过这一点而没有取得好成绩。除了使myData可观察之外,我还必须改变它的更新方式。这是新的.done方法:

    .done(function (d) {
        self.myData(ko.mapping.fromJS(d));
    })

所以,我需要做的是像对待任何其他观察一样对待这个领域。

你可以在这个新的小提琴上看到它:http://jsfiddle.net/jgergen/jF9pm/47/

我希望这比我更有帮助。我在网上搜索了这个问题的解决方案而没有任何结果。所以就是这样。

谢谢, 吉姆