8

在任何事情之前:$.getJSON 后退按钮显示 JSON 返回数据而不是页面没有帮助,以及https://groups.google.com/group/angular/browse_thread/thread/3787ad609c0beb77/eb1b57069dab9f63没有帮助,互联网也没有帮助没有帮助。

这是问题:

我从页面中调用 url 来获取 json 数据,然后在同一页面内使用 jquery 模板呈现这些数据。

想象一下,我们在http://someurl.com/search页面上,我们正在开始这样的请求

$.ajax({
  url: '/searchthis', //important, this is NOT THE SAME URL
  cache: false,
  type: 'GET',
  headers: {
    "Accept": "application/json",
  },
  dataType: 'json'
  success: function(data) {
    doSomethingWithResults(data);
  }
});

Rack 响应将缓存控制标头设置为无缓存:

Cache-Control:no-cache

一切正常,但如果您在 Chrome 中离开页面转到另一个页面,然后按后退按钮,您将看到裸 JSON 数据。当您在 IE8 中点击重新加载按钮时,也会出现相同的行为。如果您只需在地址栏中的 url 上按 Enter,两者都可以正常工作。

我不知道如何解决这个问题,因为 Chrome 的人不会这样做(参见http://code.google.com/p/chromium/issues/detail?id=108425

在我看来,这似乎是浏览器方面的误解,因为它缓存了它确实不应该缓存的东西(响应标头),并且它缓存了错误的 url 下的东西(因为 JSON 请求没有命中相同的 URL)

4

2 回答 2

6

问题实际上是 Rails:Chrome 和 IE 都请求没有特定格式的最后一个响应,所以 Rails 只接受第一个响应块,在我的例子中恰好是 json。将 html 块放在 json 块前面解决了这个问题。

respond_to do |format|
  format.html { ... } //important because the request comes with no specific format
  format.json { ... }
end
于 2012-05-24T08:05:47.043 回答
4

我对 Chrome 也有同样的问题。我的控制器的方法确实有format.html

respond_to do |format|
  format.html
  format.js
end

似乎 Chrome 缓存了结果,所以我可以通过在我的 ajax 请求中添加一个数据条目来解决这个问题,如下所示:

$.ajax({
   url: '/restful/path',
   data: { format: 'js' }, // This line here
   dataType: 'json'
});

或者您可以通过将格式附加到请求的末尾来传递格式,只需确保您(.:format)的路线中有选项

$.ajax({
   url: '/restful/path.js',
   dataType: 'json'
});

希望这可以帮助某人

于 2013-10-10T22:16:53.373 回答