从ajax post vs Static数据中淘汰映射数据

时间:2013-12-02 23:12:34

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

我在Ko映射中遇到了一个奇怪的问题。 我用这段代码:

var PList = [{ "Region": { "RegionName": "SomeRegion" }, "CDetails": {}, "Category": { "Name": "SomeCategory" }, "PSource": 1, "PDate": "0001-01-01T00:00:00"}];

var PViewModel = ko.mapping.fromJS(search('someSearch', 'True'));
var PViewModel2 = ko.mapping.fromJS(PostList);

function search(queryString, isFirst) {
    $.ajax({
        type: 'POST',
        url: 'url',
        data: { 'searchQuery': queryString },
        dataType: 'json',
        success: function (dt) {
            if (isFirst != 'True') {
                ko.mapping.fromJS(dt, PostsViewModel);
            }
            return dt;
        }
    });
};

奇怪的是,我看到了两个结果:

  1. 当我去PViewModel(由ajax填充的那个)时,我将其视为undefined
  2. 当我转到PViewModel2(具有静态数据的那个)时,我可以按预期看到对象
  3. * PViewModel2的静态数据只是ajax帖子返回的数据的副本。

    我的问题是:

    1. 有谁知道为什么会这样?以及如何解决它?
    2. 此外,if (isFirst != 'True')子句是否是启动ko视图模型的正确方法?

1 个答案:

答案 0 :(得分:1)

您正在处理异步操作(Ajax请求)。 这些操作没有返回值。因此,这永远不会起作用:

ko.mapping.fromJS(search('someSearch', 'True'));

这就是success回调的用途。传入的数据只能在那里处理。

function search(queryString, targetObservable) {
    $.ajax({
        type: 'POST',
        url: 'url',
        data: { 'searchQuery': queryString },
        dataType: 'json',
        success: function (dt) {
            ko.mapping.fromJS(dt, targetObservable);
        }
    });
};

search('someSearch', PostsViewModel);