【问题标题】:How to pass variables in my case?在我的情况下如何传递变量?
【发布时间】:2014-10-24 01:05:43
【问题描述】:

我正在尝试为我的控制器确定最佳实践。

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

第一个控制器

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

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

【问题讨论】:

  • 您的控制器结构如何?我建议不要使用 $parent

标签: javascript angularjs angularjs-scope angularjs-service


【解决方案1】:

您可以改为使用事件通知另一个控制器。

例子:-

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))都继承自其父级,最终它们都派生自其祖先处设置的$rootScopewhich means a child scope can access 属性(通过原型链)。

最终有多种方法可以在不同组件之间传递数据、通知、共享/访​​问数据。

【讨论】:

    【解决方案2】:

    最好的方法是使用服务或工厂。您可以查看this video from egghead.io 服务是单例对象,这意味着它们只有一个实例。一旦你在一个控制器中创建了一个服务实例,你就不能在另一个控制器中创建一个新实例,相反,你将获得现有实例的引用,因此可以访问来自多个控制器的数据!

    看视频,他解释得比我还好;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-09
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多