1

我有一个网页,当它被加载时,它会发出一个 ajax 请求,以从后端获取一些 JSON [] 格式的数据并将其显示在页面上。该网页是使用 MVC .NET 生成的

从后端加载事件的函数:

function initEvents() {
    $.ajax({
        url: '/Work/GetEvents/' + id, type: "GET", dataType: 'json',
        success: function (data) {
            events = data;
        },
        error: function(data) {
            //  Note: hardcoded JSON event in here
            events = hardcodedEvents;
        },
        complete: function(data) {
            // Add events
            for (var i = 0; i < events.length; i++){
                addEvent(events[i]);
            }
        }
    });
}

当我使请求失败时(即更改 url 以指向虚假数据) - 它进入error: function(data)- 所以硬编码的 JSON 对象加载正常然后它进入“完整:函数(数据)”并逐个添加事件。

但是,当我使用正确的 URL 并从后端获取事件时,事件似乎来得太晚了;就像它退出该complete部分一样。问题是:为什么会发生这种情况?complete每当回复回来时,我都想加载。我相信这个有错吗?我该如何解决这个问题,以便将事件从后端加载到页面中?

谢谢!

4

2 回答 2

2

events未在complete事件范围内定义。您应该将events数据传递给另一个函数,或者只是将addEvent逻辑移动到事件处理程序中。例如:

function onEventData(data) {
    for (var i = 0; i < data.length; i++){
        addEvent(data[i]);
    }
}

function initEvents() {
    $.ajax({
        url: '/Work/GetEvents/' + id, type: "GET", dataType: 'json',
        success: onEventData, 
        error: function(data) {
            //  Note: hardcoded JSON event in here
            onEventData(hardcodedEvents);
        }
    });
}

请注意,complete在请求完成时调用(在执行成功和错误回调之后)。由于您只想为每个请求运行一次处理程序,因此在这种情况下您不应该使用它。

于 2012-07-13T00:22:23.700 回答
1

它看起来像一个范围问题。将您的 complete() 代码移动到一个单独的函数中,并从 success() 和 error() 中调用它:

function renderEvents(data) {
    // Add events
    for (var i = 0; i < data.length; i++){
        addEvent(data[i]);
    }
}

function initEvents() {
    $.ajax({
        url: '/Work/GetEvents/' + id, type: "GET", dataType: 'json',
        success: function (data) {
            renderEvents(data);
        },
        error: function(data) {
            //  Note: hardcoded JSON event in here
            renderEvents(hardcodedEvents);
        }
    });
}

编辑:修复了 renderEvents() 中的变量名称。

于 2012-07-13T00:23:09.647 回答