【问题标题】:knockout mapping (ko.mapping.fromJS()) not updating targets when async $.ajax call异步 $.ajax 调用时淘汰映射 (ko.mapping.fromJS()) 不更新目标
【发布时间】:2014-07-25 20:28:27
【问题描述】:

我正在尝试使用 ko.mapping 将数据转换为视图模型。结果来自对 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>

并且视图模型如下:

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 调用! 我在这里做错了什么?

谢谢, 吉姆

【问题讨论】:

    标签: ajax knockout.js knockout-mapping-plugin


    【解决方案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/

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

    谢谢, 吉姆

    【讨论】:

    • 您可能想知道为什么异步 true/false 会绊倒您。答案是,当 async 为 false 时,执行 ko.applyBindings 时 myData 将包含一个值。当 async 为 true 时,myData 将在 ko.applyBindings 执行后更新。因为 myData 是不可观察的,所以绑定将应用于 null,并且在异步调用完成后,knockout 无法观察到更改。
    • @Jim 这就是要走的路:)
    • 如果你问我,移动从构造函数中取出的数据。获取初始数据后绑定模型更干净。
    猜你喜欢
    • 2015-02-26
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    相关资源
    最近更新 更多