【问题标题】:How to delete an item from a collection in the DOM, GWT如何从 DOM、GWT 中的集合中删除项目
【发布时间】:2013-04-22 09:35:51
【问题描述】:


我是 GWT 的新手。我正在编写一个页面的代码,它询问一个包含两个集合的 JSON 对象,我使用其中一个集合来填充 Flextable
这是我的 JSON 对象:

public class Users extends JavaScriptObject {

 protected Users() {
 }

 public final native JsArray<Link> getLinks() /*-{
    return this.links;
 }-*/;

 public final native JsArray<User> getCollection() /*-{
    return this.collection;
 }-*/; 
}

特别是我使用第二个集合(称为collection)来填充Flextable
但我的问题是,当我从表中删除一行时,即使我使用 http 发送请求delete 方法到服务器(和服务器删除那个项目成功),当我尝试刷新表时 GWT 不会生成对服务器的 GET 请求,(即使它是写在代码中的)和 Users 对象是一样的之前还有已删除的项目。
我已尝试使用此方法从集合中删除此项目:

public static native void remove(JsArray<?> arr, int index, int count) /*-{ 
                                                                              arr.splice(index, count);
                                                                    }-*/;
....
remove(users.getCollection(), index, users.getCollection().length());

我还尝试了其他技术:

 users.getCollection().set(index, null);

但是在这两种情况下,我都没有得到预期的结果,当我刷新表格时,我再次找到了已删除的项目。
我认为我没有正确管理 DOM,
你有什么建议吗?任何想法?我相信这是一个专家可以解决的简单问题。

编辑:
用户可以点击按钮刷新表中的数据,该事件的处理程序会向服务器执行请求,但该请求仅在第一次点击时发送。

【问题讨论】:

    标签: java javascript gwt


    【解决方案1】:

    基本上有两种选择,第一种是在服务器端将标头Cache Control设置为no-cache,而如果你不能在服务器端修改代码,例如在遗留应用程序的情况下,你可以在您的请求中的参数中附加一个随机数。请求将有一个带有附加参数的 uri,该参数是一个随机生成的数字,http:\\mydomain.com\something?random=12345。两个不同的请求将具有不同的编号,并且在第二个请求中,第一个请求的响应已被缓存,它将被忽略。这不是一个聪明的做法,但它确实有效。

    【讨论】:

      【解决方案2】:

      为了获取这样的数据,最好使用 HTTP POST 请求,因为 GET 请求正在被缓存(通过 GWT、代理服务器...)。

      还要确保您用于删除项目的服务器代码工作正常,并在 firebug 或 chrome 控制台中手动检查服务器响应,以查看您的响应是否包含已删除的记录。

      请发布您用于填充弹性表的代码,您是否在再次填充数据之前清除它?

      编辑:

      link

      如果您可以使用 celltable http://gwt.googleusercontent.com/samples/Showcase/Showcase.html#!CwCellTable(因为它包含显示在下方的元素列表)或使用某个集合 (ArrayList) 来保存 FlexTable 正在显示的数据。然后,您可以轻松地修改该集合并从中重新绘制您的弹性表。

      【讨论】:

      • GET 不是问题。问题是如果数据不应该被缓存,那么响应应该这样说。并且可以缓存但是客户端不想使用它的缓存数据,那么它应该在请求中这么说(设置Cache-Control: no-cache标头)。
      • 是的,你可以为 GET 设置 Cache-Control,或者只为 POST 更改请求类型,我认为使用 POST 更优雅。使用 GET 进行任何类型的数据获取都是丑陋的做法,当您没有意识到它的局限性(如 URI 长度、需要对所有参数进行编码等)时,可能会给您带来很多痛苦。
      • 是的,正是托马斯。以前,我曾尝试设置 Cache control: no-cache 并且它有效。但是,我不确定这是一个好的做法,因为我们需要缓存数据,而且与服务器的大量交互成本太高。
      • @JakubPawłowski 使用 POST 获取任何类型的数据是一种丑陋的做法,当您没有意识到它的局限性时可能会给您带来很多痛苦(不会缓存任何内容,这会阻止任何进一步的网络优化; 还要考虑性能,尤其是在移动设备上)。
      • @daniele 这取决于你想如何处理事情。通常,在响应中使用Cache-Control: must-revalidate(除了max-age,可能还有publicprivate 使事情明确)就足够了。在请求中使用Cache-Control: no-cache 仅用于明确想要绕过缓存的情况(例如在修改或删除值之后)。显然,最简单的方法是从本地数据中删除行而不获取(以陈旧数据为代价);您也可以让DELETE 返回列表以保存一个请求(但并非总是可行)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 2013-01-17
      • 2012-12-18
      相关资源
      最近更新 更多