2014-11-24 45 views
0

我目前的角度做一个应用程序,它做到这一点:

(网页加载)制作的角度控制器的API调用(对Symfony2的终点)得到:items

$scope.items = ItemsService.query(function(data){ 
    $scope.loading = false; 
}, function(err){ 
    $scope.loading = false; 
}); 

items是含有许多item对象阵列。 每个item包含参数例如item.param1item.param2

我建立它以类似的方式,以本教程: http://www.sitepoint.com/creating-crud-app-minutes-angulars-resource/ 即角控制器调用它调用(Symfony2的)后端API端点的服务。 端点传回从数据库获取的items。然后使用ng-repeat将项目放入视图(item in items)。

这一切工作正常。

现在,我有一个按钮(在ng-repeat中),它有效地导致对另一个symfony2端点的PUT请求,从而更新数据库中的item.param1。这也发生在我链接到的教程中。

问题是(在我的应用程序和教程中)我不得不再次进行api调用,它会更新所有项目,以便查看更改。 我想只更新视图中的数据(立即)为一个对象,而不必再次获取它们。 即是这样的:

$scope.items[4] = Items.get({id: item.id}, function(){}); 

除了应用阵列关键是不知道,所以我不能做到这一点。 (所以像:?$scope.items.findTheOriginalItem(item) = Items.get({id: item.id}, function(){});

另一种可能的解决方案(这似乎是它可能是最好的),我已经在这里看了: http://teropa.info/blog/2014/01/26/the-three-watch-depths-of-angularjs.html ,并试图做平等$表:$scope.$watch(…, …, true);因此,使用的手表看当item子阵列被更新时,虽然它看起来没有更新视图中的数据(尽管它正在数据库中更新)

任何有关这样做的最佳方法的建议(以及如何做到这一点)将是伟大的!谢谢!

+0

如果你知道什么是对你的项目改变为什么你需要在提出的要求服务器?只需更新视图(因为无论如何你都会更新服务器,你会保持一致我猜) – 2014-11-24 21:14:52

+0

我需要向服务器发出请求,以便服务器可以更新数据库! 问题是,当数据库更新时,它不会立即反映在视图中(这就是为什么我需要再次调用重新获取项目(最好不要进行此调用,只是反映在视图中,因为正确的数据已经存在)) – timhc22 2014-11-24 22:31:27

+0

您是否在更改后尝试使用'scope.digest()'? – 2014-11-24 22:33:15

回答

1

本质上按钮点击sho使用ng-click执行一个函数并将该项传递给该函数。例如:

...ng-repeat="item in items"... <button type="button" ng-click="updateItem(item)">Update</button ...

然后在功能你必须要更新的具体项目。如果你正在使用$资源,这将是这样的:

$scope.updateItem = function(item) { item.$update(...); };

除非我不明白你

+0

是的,谢谢你的帮助! – timhc22 2014-11-25 11:52:05

+0

我现在遇到的问题是,它在视图中显示为已更新,并且显然是发送PUT请求(可以使用chrome的网络选项卡查看),但它不会被后端接收。 (虽然GET请求)。文档和教程略有混淆,因为有人说使用.update,另一个说使用$ update(.update将对象传递给服务,而不是。$ update对象本身就是我正在使用的)。关于为什么后端不接收来自前端的任何数据的请求的任何想法? – timhc22 2014-11-25 11:54:12

+0

这是代码: ItemsService.update({ID:item.id},项,功能(){$ = scope.loading假; },函数(ERR){$ = scope.loading假; item.param1 = true; //如果失败返回true }); – timhc22 2014-11-25 11:55:06