【发布时间】:2015-10-30 08:40:36
【问题描述】:
我在前端使用 AngularJS 1.2.x 和 xeditable 来编辑项目并更新数据库。我的后端是 Rails 3.2。
我有一个有多个版本的关卡对象,每个版本都有一个 from_date 和 cost_cents 字段,我在其中设置了 xeditable 来进行内联编辑。问题是在我编辑这些之后,如果我刷新屏幕,旧值就会显示出来。如果我在浏览器中禁用缓存,但我会得到正确的值。所以我需要一种方法来将父对象的缓存标记为脏。
这是一个在日期字段上使用 xeditable 来获取级别版本的示例。
<td editable-text="version.from_date"
onbeforesave="update_version(level.id, version.id, $data, version.cost_cents)"
class='date'>{{version.from_date}}</td>
是否可以让 AngularJS 或 angular-xeditable 将父对象的缓存标记为脏,以便从数据库中重新加载值?
更新:改用表单
我用表单替换了 xeditable,但缓存仍然存在同样的问题。这不会发生在我的开发服务器上,仅在登台和生产服务器上。
<form ng-submit="update_version(level.id, version.id, version.from_date, version.cost_cents)">
Date: <input type='text' id="from_date" name="version.from_date" ng-model="version.from_date" />
Cost: <input type='text' id="cost_cents" name="version.cost_cents"
ng-model="version.cost_cents"
form-cents-to-dollars />
<button id="update_btn" type="submit" class="confirm_btn">
<i class="fa fa-pencil"></i> Update Version
</button>
<td><a id="edit" href="/api#/levels/{{level.id}}/edit_version/{{version.id}}">Edit</a></td>
<td><a id="delete" href="" ng-confirm-click="delete_version(version.id)">
<i class="fa fa-trash-o fa-lg" /></a></td>
</form>
更新:删除 cookie
如果我在 Firefox 中加载登台服务器并进行相同的测试,然后删除当前会话的 cookie 并刷新我的版本,列出它现在显示数据库中的正确数据。
更新:响应 304 未修改
我得到的响应是 http 304: Not Modified,事实上我确实修改了数据,但由于它是一个子对象,AngularJS 没有拾取它。
更新:想法
我开始认为可能是 Rails 正在做缓存?
通过在开发中将此标志切换为 true,我现在可以在开发模式下复制相同的问题。这样可以节省很多时间。
config.action_controller.perform_caching = true
更新:Hacky 解决方法
如果我在 AngularJS http 调用的末尾标记一个随机数,那么它不会调用缓存并且每次都能正常工作。虽然这有点 hacky,但我想要一种更好的方法。
$http({method: 'GET', url: "/levels/#{$stateParams['id']}?rnd="+new Date().getTime(), cache: false}).
success( (data, status, headers, config) ->
$scope.level = data
)
【问题讨论】:
-
尝试使用这个
-
我真的只需要两次调用就可以不调用缓存。如果我使用元标记会阻止缓存单个页面应用程序上的每个调用吗?
-
如果你想为特定的调用禁用它,然后通过附加一些随机查询字符串使你的 url 每次调用时都是唯一的。 "/your_url?noCache="+new Date().getTime()
-
user1096656,这就是我在上次更新中所做的:'Hacky workaround'。
-
您还可以为您的特定 $http.GET 请求添加值为 'no-cache' 的 'Cache-control' 标头。
标签: javascript ruby-on-rails angularjs caching