我正在尝试为我的控制器决定最佳做法。
我有多个控制器,我需要传递数据。
第一个控制器
app.controller('testCtr', ['$scope','$rootScope', function($scope, $rootScope) {
$scope.testdata = true;
}])
第二个控制器
app.controller('secondCtr', ['$scope','$rootScope', function($scope, $rootScope) {
var test = $rootscope.testdata;
}])
我的第二个选择是使用$ parent
第一个控制器
app.controller('testCtr', ['$scope','$rootScope', function($scope, $rootScope) {
$scope.testdata = true;
}])
第二个控制器
app.controller('secondCtr', ['$scope','$rootScope', function($scope, $rootScope) {
var test = $scope.$parent.$parent.testdata;
}])
我不确定最好的方法是什么。任何人?谢谢!
答案 0 :(得分:3)
您可以使用事件通知另一个控制器。
实施例: -
app.controller('testCtr', ['$scope','$rootScope', function($scope, $rootScope) {
$scope.testdata = true;
$rootScope.$broadcast('DATA_UPDATED', $scope.testdata);
}]);
并使用
接收app.controller('secondCtr', ['$scope','$rootScope', function($scope) {
$scope.$on('DATA_UPDATED', function(e, data){
testData = data;
//do something with the data
});
}]);
这完全取决于控制器的排列方式,而不是绕过数据you could use a service (which are singletons) which manages the data。所以一个控制器可以通知其他控制器"我已经更新了你现在得到它"。其他控制器会在接收到可以调用服务并获取更新数据的事件通知时,对共享和管理数据的相同服务注入依赖关系。 Here is another good read on various services options in angular
再次使用$rootScope
到$broadcast (downwards)
或$emit(upwards)
或仅使用$scope
本身来执行此操作取决于控制器的结构($ rootScope.broadcast有助于解决那,但你需要注入$ rootScope,这有时是不方便的)。但是,最好在任何地方实施相同的实施,而不必担心控制器的结构,i have a pub/sub mechanism created for that, which i generally use and you can find it here。在控制器之间共享数据时要担心的另一件事是,如果要传递对象,则对象的引用将复制到目标上,因此目标上的任何更新都将反映源本身的更改,在某些情况下,这是不可取的。您可以在发送时angular.copy(data)
来源的数据。
另请注意,范围遵循原型继承模式,即所有范围(孤立范围除$scope.$new(true)
)都是从其父级继承的,最终它们都来自$rootScope
which means a child scope can access在其祖先设置的属性(通过原型链)。
最终,有许多方法可以在不同组件之间传递数据,通知,共享/访问数据。
答案 1 :(得分:2)
最好的方法是使用服务或工厂。你可以查看this video from egghead.io 服务是单例对象,这意味着它们只有一个实例。在控制器中创建服务实例后,您无法在另一个服务器中创建新实例,而是获得现有实例的引用,因此可以访问来自多个控制器的数据!
观看视频,他可以比我更好地解释它;)