0

我正在努力解决我正在开发的网络应用程序的概念问题。该应用程序允许用户拖放 DOM 元素(如便笺、列表、图像)。您将元素从菜单拖到一张纸上。一旦你删除了一个,应用程序会向服务器发出 AJAX 调用以保存该元素(位置、颜色等)。服务器以一个 id 回答,然后将其作为其 id 属性保存到 DOM 元素中。当您再次移动该元素时,将进行相同的 AJAX 调用,但使用其 id。

但问题是,如果我快速将一个新元素放在放置区域上然后再次移动它,它会创建重复的条目,因为第一个 AJAX 调用尚未完成,第二个调用没有 id(因为它必须来从服务器)。

这是用于保存元素的 javascript 代码的简化示例:

function saveObject(object,action){

    var params = {
        x : object.position().left,
        y : object.position().top,
        w : object.width(),
        h : object.height(),
     };

    if(object.attr("id")){
         params.id = object.attr("id");
    }

    $.post("/save_object",params,function(data){
        if(data.success){
            object.attr("id",data.data);
        }
    });

}

在服务器端,我只检查一个 id,然后我使用该 id 运行“创建”函数或“修改”函数。

这是非常具体的,我看过很多关于 ajax 复制的帖子,但在这里设置标志无济于事。我无法阻止发出 AJAX 请求,因为它不应该阻止任何 UI 元素并且我不想丢失任何保存事件。我有一些限制要坚持,因为此页面是动态的,并且同一页面上的用户可以看到彼此用户的事件。

在这一点上,我将感谢任何答案。

4

2 回答 2

1

有几种不同的方法可以解决这个问题,我会让你选择一种可能更适合你的应用程序。

选项一是通过将请求存储在数组中来对服务器的请求进行排队。然后,您将有一些逻辑可以一一发送请求。

选项二是通过使用 GUID 而不是自动递增 ID 将对象 ID 初始移动到客户端。然后,您可以将这些保存到服务器而不必担心重复或覆盖。我还建议使用 MVC 来保持逻辑的组织性,例如,backbone.js。

于 2013-10-07T11:58:24.253 回答
0

使这项工作无缝...

1.您必须阻止拖放功能,直到较早的请求完成

或者

2.如果有新请求,则中止先前的请求。

您可以有一个排队逻辑...您可以将所有请求存储在一个数组中...一个 xmlHTTP 对象数组。然后,您可以选择在队列中发送 ajax 请求,或者一次只发送一个请求,同时丢弃所有其他请求。

于 2013-10-07T11:49:57.603 回答