【问题标题】:Javascript table on the fly运行中的 Javascript 表
【发布时间】:2012-10-04 12:53:33
【问题描述】:

我遇到了一些关于 javascript 的问题。这会导致一些问题。 我正在使用 DevExpress MVC GridView、ASP.Net MVC 3 和 javascript。

这是我的问题:

我有一个网格视图,例如客户。 我希望他们选择客户,并将它们显示在由 javascript 生成的表格中,这样我们就不会得到所有这些刷新。然后他们可以添加其他信息,以便可以再次将它们保存到另一个表中,但这并不重要。

在从选定的客户生成表格行之前,我执行了一些计算。另一个问题是,devexpress gridview 有一个事件会在每次选择更改时调用,而不是等待约 100 毫秒,这样用户就可以快速多选而无需触发方法 3/4 次。

我正在通过一个数组跟踪我自己的表。 DevExpress 的 GridView 有他自己的事件,可以给我正确的信息,所以不用担心。 所以我得到了一个方法 receiveSelectionFields(Values){ //do something },我从每个选择的 gridview 接收该信息。 然后我检查我的数组,看看他们是否添加或删除了选择,以及哪些。 然后我调用 addtablerow(customer) 或 removetablerow(customer)。这会将客户从我的表中删除,然后从我的数组中删除。

因为我在两者之间进行了一些繁重的计算,所以在计算完成之前会有大约 60 毫秒的延迟(在我的电脑上)。因此,如果用户在 60 毫秒内做出 2 次选择。我的数组将具有错误的值(不会被添加/删除客户的第一个调用修改),并且我的 javascript 将导致错误,例如表行没有被删除。我检查我自己的数组的长度和接收到的数组的长度,看看是否添加或删除了一些东西。

那么我尝试了什么? 使我的方法成为递归方法,当问题发生时,它会等待 60 毫秒,然后重做该方法。但这不能正常工作。

我尝试添加一个全局变量busy,当方法仍然忙时这是真的。结束时为假。但是我的浏览器在这样做时就退出了。这是代码:

    while (true) {

        setTimeout(function () {
            if (busy === false) {
                break;
            }
        }, 50);
    }

但我感觉它只是无休止地循环。

这些都是变通方法,一定有一个很好的方法来解决这个问题。有什么想法吗?

简而言之: 我想要一种让功能同步关闭的方法。即使它们被称为异步。由用户,这样我的数组就不会乱了。

找到了为什么我的问题存在的答案: 由于javascript是同步的。语言(1 个线程)。这些功能应该在正确的时间触发。问题是来自 DevExpress Gridview for MVC Extensions 的回调。它对服务器进行回调,该服务器在大约 150 毫秒内响应选定的字段值。如果您快速触发 devexpress 函数两次,这将产生错误。第二个触发器有一个比第一个触发器返回更快的窗口。这意味着我的表格编码被破坏了,因为我检查了是否添加或删除了某些东西。因此,当第一个触发器(在第二个触发器后返回)和我的表被更新时。它显示了我上次选择之前的表格。因此缺少 1 行或多出 1 行。

所以我必须创建一个函数来检索所有事件,然后在每个订单后约 200 毫秒将它们按顺序排列。确保有足够的时间让回调检索。虽然这当然仍然不可靠,但我想我会改变这方面的要求。

【问题讨论】:

  • 您尝试联系开发快递支持/论坛?我总是觉得 devexpress 的东西很不标准。
  • 与其说是 devexpress 的问题,不如说是 javascript 的问题。

标签: javascript asp.net-mvc-3 gridview devexpress


【解决方案1】:

您的 while 循环条件为真,因此循环将无限继续。您可能想尝试以下方法:

var int = setInterval(function () {
    if(busy === false) {
        clearInterval(int);
    }
}, 50);

试试这个,而不是一遍又一遍地循环 setTimeout。如果我不得不猜测,break 会破坏 if 语句,但不会破坏 while 循环,从而导致浏览器陷入无限循环。使用上面的代码,您可以设置运行代码的时间间隔。在这种情况下,代码每 50 毫秒运行一次。一旦 if 语句中的条件为真,setInterval 就会被清除,从而使浏览器继续执行其正常功能。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    相关资源
    最近更新 更多