在控制器之间传递数据

Koe*_*enJ 37 angularjs

我说要学习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);  
   }            
Run Code Online (Sandbox Code Playgroud)
  • 它会像Controller一样工作.您首先创建控制器,有机会将其置于正确的状态; 然后创建视图.

现在,在AngularJS中,我正在处理这个:

 var self = this;
 onClick = function(){
          self.$locationService.path('approve');       
 }
Run Code Online (Sandbox Code Playgroud)
  • 这就像View-first一样.您说要导航到哪个视图/路径,Controller由框架创建.

我发现很难控制创建的Controller的状态并将数据传递给它.我已经看过并尝试过以下方法,但在我看来,所有这些都有自己的问题:

  1. 将共享服务注入InputCtrl和ApproveCtrl,并将所有数据放在此服务上共享
    • 这看起来像是一个肮脏的解决方法; 共享服务中的状态变为全局状态,而我只需要它将数据传递给ApproveCtrl
    • 这个共享服务的生命周期比我需要的时间长 - 只是为了将数据传递给ApproveCtrl
  2. 传递$ routeParams中的数据
    • 传递大量参数时,这会变得非常混乱
  3. 使用$ scope事件
    • 从概念上讲,这不是我会使用事件的东西 - 我只需要将数据传递给ApproveCtrl,没有任何事件是什么
    • 这非常麻烦; 我必须首先向父母发送一个事件,然后将其广播给它的孩子

我在这里错过了什么吗?我创造了太多小型控制器吗?我是否试图在这里过多地保留其他框架的习惯?

XLI*_*LII 56

在结构方面,AngularJS比MVC更模块化.

经典MVC描述了3个简单的层,这些层以这样的方式相互交互,即Controller使用View拼接模型(而Model不应该直接使用View,反之亦然).

在Angular中,您可以拥有多个,一些完全可选的实体,这些实体可以通过多种方式在彼此之间进行交互,例如:

可能的相互作用

这就是为什么有多种方式在不同实体之间传递数据.您可以:

要么

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

......还有更多.由于其多样性,Angular允许开发人员/设计师选择他们最舒适的方式并继续进行.我建议您阅读AngularJS开发人员指南,在那里您可以找到一些常见问题的幸福解决方案.

  • 这是一个非常详细的答案,但我认为使用**服务**是最好的选择:http://stackoverflow.com/questions/20181323/passing-data-between-controllers-in-angular-js (3认同)
  • 谢谢你的详细解答; 我知道AngularJS中有一些选项,我想知道大多数人如何处理我认为常见的情况. (2认同)

Cla*_*lay 8

如果您的目的是简单地在两个视图之间共享数据,那么服务可能就是您的选择.如果您对持久存储到数据存储感兴趣,可能需要考虑某种后端服务,例如REST API.看看这个$ http服务.