我一直在关注本教程http://draptik.github.io/blog/2013/07/28/restful-crud-with-angularjs/。我用它实现了Grails后端,而不是教程中的Java。
我有来回的数据,有一个问题。如果我创建/更新/删除用户,我在重定向时没有看到用户列表中反映的更改。我必须刷新页面才能看到更新。
查看编辑的网络流量,它看起来像PUT并在PUT完成之前触发GET。假设这是因为$ resource返回一个promise,所以事情可以异步完成。那么如何处理这个问题,以便当$ location重定向我时,我的列表是最新的?
我猜测选项是在重定向/查询列表之前等待PUT完成,还是以某种方式手动管理$ scope.users以匹配请求?
或者这个教程可能只是个坏例子?也许还有更好的方法(仍使用$ resource)?
注意:我在那里看过Restangular,并且我已经看到$ http成功回调,但我想了解上面的情况。
答案 0 :(得分:0)
解决此问题的一种方法是不重定向到列表页面,直到获得回调,然后执行重定向。你可以在那个时候显示一些忙碌的指标。资源调用看起来像这样。
resource.update(config,data,function() { //gets called on success},
function(error) { //gets called on failure});
在现实生活中,等待更新响应的场景是有意义的,因为您希望在同一页面上处理错误和成功场景。
答案 1 :(得分:0)
我无法在任何地方看到您的代码,所以我只是假设(基于您所写的内容和您当前的问题)
每次更改用户并(重新)将结果绑定到范围时,您可能正在进行完整(或部分)获取。在资源的回调中执行此操作实际上应该启动摘要周期angular do来更新修改的对象。如果您在$ resource之外进行了提取 - 例如使用custom / jquery ajax,则需要执行$ scope。$ apply()
我真的不明白你需要等待回调。您已经知道添加/修改了用户。而不是分离'来自您的作用域的用户,修改它,将其发布到您的休息服务器,然后等待回调,并将其重新插入作用域 - 为什么不直接在您放在作用域的列表/数组中修改它?
var users = Users.get(function () {
$scope.users = users.record; // bind the resulting records to the scope
});
$scope.updateUser = function (user) {
resource.update(...); //pseudo
};
然后在你的html中,你将保留对currentUser的引用,div列表将自动更新。
<div ng-repeat="user in users" ng-click="currentUser=user">{{user.Name}}</div>
<input ng-model="currentUser.Name">
<button ng-click="updateUser(currentUser);">Update</button>
如果您不希望在键入内容时看到列表中的更新,但只有在您的回叫触发或按下按钮时,才会使用另一个ng-model作为输入,如下所示:< / p>
<input ng-model="tempUser.Name">
然后您将在updateUser方法或资源回调中复制另一个值,如下所示:
$scope.updateUser = function (user) {
user.Name = $scope.tempUser.Name; // should update automaticly
resource.update(...) // pseudo
}
希望它有所帮助!