在控制器之间传递数据
我打算学习来自许多不同的MV *框架的AngularJS。 我喜欢这个框架,但是我在控制器之间传递数据时遇到了麻烦。
假设我有一个input(input.html)和一个控制器的屏幕,让我们说InputCtrl。
这个视图上有一个button,可以把你带到另一个屏幕,比如批准(approve.html)和一个控制器ApproveCtrl。
这个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-一样工作。 你首先创build控制器,有机会把它放在正确的状态; 之后视图被创build。
现在,在AngularJS中,我正在处理这样的:
var self = this; onClick = function(){ self.$locationService.path('approve'); }
- 这工作像查看优先。 你说哪个视图/路线来导航,Controller是由框架创build的。
我发现很难控制创build的Controller的状态并将数据传递给它。 我已经看到并尝试了以下方法,但是在我看来,所有方面都有自己的问题:
- 将一个共享服务注入到InputCtrl&ApproveCtrl中,并把所有要共享的数据放在这个服务上
- 这看起来像一个肮脏的工作周围; 共享服务中的状态变成了全局状态,而我只是需要它将数据传递给ApproveCtrl
- 这个共享服务的生命周期比我所需要的更长 – 只是将数据传递给ApproveCtrl
- 传递$ routeParams中的数据
- 在传递很多参数时,这会变得非常混乱
- 使用$范围事件
- 从概念上讲,这不是我会使用事件 – 我只需要传递数据到ApproveCtrl,没有事件ish
- 这很麻烦, 我必须首先向父母发送一个事件,然后将其传播给它的孩子
我在这里错过了什么? 我是否创build了太多的小控制器? 我在这里试图坚持从其他框架的习惯吗?
就结构而言,AngularJS比MVC更模块化。
经典的MVC描述了3个简单的图层,它们以这样的方式相互交互,即控制器将模型与视图(而模型不应该直接用于视图,反之亦然)工作。
在Angular中,您可以有多个完全可选的实体,它们可以通过多种方式相互交互,例如:
这就是为什么在不同的实体之间有多种沟通方式。 您可以:
- 使用
this
和$scope
之间的差异直接在控制器之间发送消息 - 使用事件发送消息
- 使用共享系统发送消息(注意:与上面相同的链接,答案显示两种技术)
要么
- 使用AJAX后端发送消息
- 使用外部系统发送消息(如MQ )
…还有更多。 由于Angular的多样性,开发者/devise者可以select最舒适的方式继续使用。 我build议阅读AngularJS开发者指南 ,在那里你可以find一些常见问题的祝福解决scheme。
如果你的意图是简单地在两个视图之间共享数据,一个服务可能是要走的路。 如果您有兴趣坚持数据存储,则可能需要考虑某种后端服务,如REST API。 看看这个$ http服务。
即使XLII给了一个完整的回应,我发现这个教程使用一个服务。 这是非常有趣和简单的方法来使用2种方式绑定属性在控制器之间共享数据: https : //egghead.io/lessons/angularjs-sharing-data-between-controllers
我现在还没有使用它。
否则,还有其他方式,根据事件: http : //www.objectpartners.com/2013/08/21/using-services-and-messages-to-share-data-between-controllers-in-angularjs/
如果您希望将简单的string数据从一个页面(page1)传递到另一个页面(page2),则一种解决scheme是使用传统的url参数。 用参数“/ page2 / param1 / param2”调用page2路由url。 page2的控制器将接收“ routeParams ”中的参数。 您将能够访问参数作为routeParams.param1和routeParams.param2 。 下面的代码是通过: 如何获得使用angularjs的url参数
从page1的控制器(js)或其html中的url调用page2路由,参数为:
"/page2/param1/param2"
第2页路线:
$routeProvider.when('/page2/:param1/:param2', { templateUrl: 'pages/page2.html', controller: 'Page2Ctrl' });
和控制器:
.controller('Page2Ctrl', ['$scope','$routeParams', function($scope, $routeParams) { $scope.param1 = $routeParams.param1; $scope.param2 = $routeParams.param2; ... }]);
现在,您可以访问page2的html /模板中的参数(param1和param2)值。