如何在我的情况下传递变量?

时间:2014-08-30 01:15:33

标签: javascript angularjs angularjs-scope angularjs-service

我正在尝试为我的控制器决定最佳做法。

我有多个控制器,我需要传递数据。

第一个控制器

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;
}])

我不确定最好的方法是什么。任何人?谢谢!

2 个答案:

答案 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 服务是单例对象,这意味着它们只有一个实例。在控制器中创建服务实例后,您无法在另一个服务器中创建新实例,而是获得现有实例的引用,因此可以访问来自多个控制器的数据!

观看视频,他可以比我更好地解释它;)