Angular Service使用它更新所有范围

时间:2015-02-13 07:16:36

标签: angularjs

我一直在阅读服务非常适合共享数据。但我很难让所有数据同步......

例如,让我们说你有

  • 包含一系列项目的ItemService
  • 一个ItemListController,其中显示了一个项目列表($scope.items = ItemService.items
  • 一个AddItemController,一个向项目添加项目的表单(使用该服务)。

当我添加新项目时,它不会自动显示在列表控制器中。到目前为止,我的解决方法是在路由器中使用cache:false,以便每次看到它时都会刷新...

我无法使用$scope.$apply()因为添加发生在一个控制器上,而我希望在另一个控制器上看到...

2 个答案:

答案 0 :(得分:1)

在成功更新服务中的数组后,您需要在启动更改的控制器(AddItemController)中使用$rootScope.$broadcast('item.added');

然后在ItemListController中使用

$rootScope.$on('item.added', function(event){
  $scope.items = ItemService.items;
});

选中此question

答案 1 :(得分:1)

@Sarpdoruk视图和控制器之间存在双向数据绑定,但控制器和服务之间不存在。通过使用此行$scope.items = ItemService.items;,您可以将“服务”中的“项目”复制到控制器中的items,但您可以按值复制,而不是按引用复制。您可以在视图或控制器中更改$scope.items,它们将在视图和控制器之间进行更新,但这些更改不会对服务产生任何影响。如果你更新服务中的项目也是一样的 - 控制器不会知道某些东西已被更改 - 所以你需要$ broadcast或$ emit从服务中改变一些内容并监听控制器中的更改。您还可以在控制器,指令甚至服务之间进行广播(但由于服务无法访问$ scope,您必须使用$ rootScope,而有些人则对此不满意)。最重要的是,如果你真的必须在服务中使用$ rootScope,否则你将不得不使你的应用程序的部分过于复杂,然后这样做,从不打扰“最佳实践传道者”该应用程序的第一条规则是它必须工作,只有在它工作后你应该担心干净的代码。我希望它现在更清楚了。