一尘不染

在控制器之间传递数据

angularjs

我打算学习来自许多不同的MV *框架的AngularJS。我喜欢框架,但是在控制器之间传递数据时遇到了麻烦。

假设我有一个带有一些输入(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。

我发现很难控制创建的Controller的状态并将数据传递给它。我已经看到并尝试了以下方法,但是我认为所有方法都有其自身的问题:

  1. 将共享服务注入InputCtrl和ApproveCtrl,并将所有数据共享到该服务上
    • 这看起来像一个肮脏的解决方法;共享服务中的状态变为全局状态,而我只需要它即可将数据传递给ApproveCtrl
    • 此共享服务的生存期比我需要的更长-仅将数据传递给ApproveCtrl
  2. 在$ routeParams中传递数据
    • 当传递很多参数时,这变得非常混乱
  3. 使用$ scope事件
    • 从概念上讲,这不是我要用于事件的东西-我只需要将数据传递给ApproveCtrl,就没有事件了
    • 这很麻烦。我必须先向父母发送事件,然后再将事件广播给孩子

我在这里想念什么吗?我会创建太多小型控制器吗?我是否在这里过多地坚持其他框架的习惯?


阅读 198

收藏
2020-07-04

共1个答案

一尘不染

就结构而言,AngularJS比MVC更模块化。

经典MVC描述了3个简单的层,它们相互交互,以便控制器将模型与View缝合在一起(模型不应该直接与View一起使用,反之亦然)。

在Angular中,您可以有多个完全可选的实体,它们可以通过多种方式相互交互,例如:

可能的相互作用

这就是为什么有多种方法在不同实体之间传递数据的原因。您可以:

  • 使用和之间的差异直接在控制器之间发送消息this``$scope
  • 使用事件发送消息
  • 使用共享系统发送消息(注意:与上面相同的链接,答案显示了两种方法)

要么

  • 使用AJAX后端发送消息
  • 使用外部系统(例如MQ)发送消息

…还有更多。由于其多样性,Angular允许开发人员/设计人员选择最适合自己的方式进行下去。我建议你阅读AngularJS开发指南,你可以找到
祝福 解决一些常见问题。

2020-07-04