我有一个带有两个控制器的应用程序,我希望在一个控制器中进行更改以影响存储在另一个控制器中的(不同)数据。 tl; dr当我从第一个控制器中删除一个类别时,我想编辑第二个控制器中具有该类别的任何项目,以便它们现在可以是无类别的。
据我所知,我想要的是使用服务,但我觉得如果有一种方法可以简单地编辑控制器范围内的数据会更简单。所以我的问题是:
有没有办法简单地编辑控制器数据或从服务中调用控制器方法?
否则,将后一个控制器的数据存储在服务中是否合理,即使前一个控制器只需要访问权限来更改它?为了进行ng-repeats,我如何引用这些数据?
编辑:澄清数据是一组json对象,其中包含每个类别和每个项目的数据,并且网页包含要经过的ng-repeats并列出每个对象。我有许多编辑两个数据列表的函数,我希望更改一个列表以在另一个列表中进行更改。
答案 0 :(得分:0)
您的想法是正确的,您应该将所有业务逻辑(包括需要在应用程序的不同部分之间保持一致的数据)放入services
。 controller
应该只管理视图并将数据连接到它。
请注意,service
是Singleton s - 每个service
始终只有一个实例,包含您的数据。
回答你的问题:我认为将数据存储在service
而不是controller
时总是合理的(当数据不是特定于多个视图之一时,但是在整个当前应用程序状态中保持一致,并且访问该数据来操作它是完全正常的 - 甚至更好的是将操作逻辑放入服务本身(或仅用于该服务的另一个服务)并且让{{1连接到调用它的调用。
Todd Motto在该主题上有一个article(瘦控制器)
答案 1 :(得分:0)
我认为最好将事件用于此目的。在您的第一个控制器中,您可以发布类别删除事件,如下所示。
$scope.deleteCategory = function (category) {
$rootScope.$broadcast("categoryDeleted", category);
}
然后您可以在第二个控制器中的任何控制器中观察此事件,您可以听取categoryDeleted事件。
$scope.$on("categoryDeleted", function (event, category) {
// do whatever you want
});
答案 2 :(得分:0)
不要直接从服务中调用控制器,这不是一种不好的做法,不仅在AngularJS中,而且在大多数语言框架中。
您所描述的问题(“一个控制器的变化影响(另一个)存储在另一个中的数据”)是组件之间的通信问题。您可以使用事件解决此问题,因此无需将数据从第二个控制器移动到服务。
让我们考虑一些例子: http://jsfiddle.net/simpulton/XqDxG/
当您单击LOG按钮时,将调用this.broadcastItem(),并广播'handleBroadcast'事件。 其他控制器,controllerOne和controllerTwo,处理此事件:
$scope.$on('handleBroadcast'
并做他们想做的事情。
因此,在您的情况下,您可以引入'categoryRemoved'事件,并在第一个控制器中广播此事件。广播事件后,您的第二个控制器会处理它并编辑其项目。 此外,您应该在事件中传递已删除的类别(而不是示例中的“msg”),以便第二个控制器必须知道哪个类别已被删除。
答案 3 :(得分:-1)
你想要这样做,可以使用$ rootScope(在控制器之间共享 - 在一个中共享,在另一个中访问),但它通常是个坏主意。我不确定我是否正确但它的典型情况,当你真的需要服务控制一些外部数据..它想要修改一些静态json?你能说得更清楚吗? :)