我说要学习 AngularJS,它来自许多不同的 MV* 框架。我喜欢这个框架,但是我在控制器之间传递数据时遇到了麻烦。
假设我有一个带有一些输入 (input.html) 的屏幕和一个控制器,比如说 InputCtrl。
此视图上有一个按钮可将您带到另一个屏幕,假设使用控制器 ApproveCtrl 批准 (approve.html)。
这个 ApproveCtrl 需要来自 InputCtrl 的数据。这似乎是大型应用程序中非常常见的场景。
在我以前的 MV* 框架中,这将像(伪代码)一样处理:
var self = this;
onClick = function() {
var approveCtrl = DI.resolve(ApproveCtrl);
approveCtrl.property1 = self.property1;
approveCtrl.property1 = self.property2;
self.router.show(approveCtrl);
}
- 它首先会像 Controller- 一样工作。您首先创建控制器,有机会将其置于正确的状态;之后视图被创建。
现在,在 AngularJS 中,我的处理方式如下:
var self = this;
onClick = function(){
self.$locationService.path('approve');
}
- 这就像查看优先。您说要导航到哪个视图/路线,控制器由框架创建。
我发现很难控制创建的 Controller 的状态并将数据传递给它。我已经看到并尝试了以下方法,但我认为都有自己的问题:
- 在 InputCtrl & ApproveCtrl 中注入一个共享服务,并将所有要共享的数据放在这个服务上
- 这看起来像是一个肮脏的解决方法;共享服务中的状态变为全局状态,而我只需要将数据传递给 ApproveCtrl
- 这个共享服务的生命周期比我需要的要长 - 只是将数据传递给 ApproveCtrl
- 在 $routeParams 中传递数据
- 当传递大量参数时,这会变得非常混乱
- 使用 $scope 事件
- 从概念上讲,这不是我会使用事件的东西 - 我只需要将数据传递给 ApproveCtrl,没有任何事件
- 这很麻烦;我必须先向父母发送一个事件,然后将其广播给它的孩子
我在这里错过了什么吗?我是否创建了太多的小型控制器?我是否试图在这里过多地保留其他框架的习惯?