0

我正在尝试构建一个 windows8 应用程序,我使用 SplitApp 作为基础。只是试图从 AJAX 添加数据但它失败了。

在文件 data.js 我有:

(function () {

    var list = new WinJS.Binding.List();

    $.each(data(), function (key, item) {
        list.push(item);
    }); 

}
})();

在我拥有的文件 app.js 中(这有效并填充了应用程序中的列表)

function data() {

   var testGroupMeeting = [];
   var testMeeting = [];

   testGroupMeeting.push(new Group({ id: "1", title: "Group1" }));

   testMeeting.push(new Meeting({ group: testGroupMeeting[0], title: "Item Title: 1"       }));

   return testMeeting;


}

但是,当我想使用 AJAX 获取数据并在填充时返回 testMeeting 时,它会崩溃。

在文件 app.js 我有(不工作),但我需要让它工作

function data() {

   var testGroupMeeting = [];
   var testMeeting = [];

$.ajax({
    url: "/json/json.php",
    dataType: 'json',
    contentType: 'text/json',
    type: 'GET',
    success: function (data) {

           //Data here is correct and mapped to the arrays, its the same as in the abow example, i have the same data in the arrays as in the above example



        }
        return testMeeting;
    }

});


}

但问题似乎是 AJAX 不应该返回任何东西。而且我无法对 data.js 进行回调,因为您可以看到该函数是匿名的。

你会怎么做?

4

1 回答 1

0

这不能以这种方式工作,因为 $.ajax 函数是异步的:它执行 ajax 调用,然后使用适当的数据调用“成功”函数。

您将重写 $.each(data() ... 以便调用 data() 并期望它返回 testMeeting ,而不是调用 data 并期望它使用 testMetting 对象调用回调。

就像是 :

(function () {

    var list = new WinJS.Binding.List();

    getData(function (theMetting) {


        $.each(theMeeting, function (key, item) {
          list.push(item);
        }); 

 }
})();


// callback is a function that will be called with 
// something that is built from the server, after the ajax
// request is done
function getData(callback) {


 $.ajax({
    // ... everything you did ... 
    success: function (data) {

       // ... use the data to build the meeting object
       // and pass it to the callback
       callback(meeting)


    }
    return testMeeting;
}

});

}

同步代码(返回函数)和异步调用(做一些工作,然后用结果调用回调)之间存在根本区别。$.ajax 是典型的异步函数。

理论上,您可以将“async”标志传递给 ajax,以便在 Ajax 调用完成之前 $.ajax 函数不会返回,但您可能不想这样做,因为它会阻止您的 UI。

希望这会有所帮助。

于 2013-02-22T14:47:49.923 回答