Javascript 在我的例子中如何传递变量?

Javascript 在我的例子中如何传递变量?,javascript,angularjs,angularjs-scope,angularjs-service,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 =

我正在努力确定控制器的最佳实践

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

第一控制器

app.controller('testCtr', ['$scope','$rootScope', function($scope, $rootScope) {
    $scope.testdata = true;
}])
app.controller('secondCtr', ['$scope','$rootScope', function($scope, $rootScope) {
    var test = $rootscope.testdata;

}])
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;
}])
第二控制器

app.controller('testCtr', ['$scope','$rootScope', function($scope, $rootScope) {
    $scope.testdata = true;
}])
app.controller('secondCtr', ['$scope','$rootScope', function($scope, $rootScope) {
    var test = $rootscope.testdata;

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

第一控制器

app.controller('testCtr', ['$scope','$rootScope', function($scope, $rootScope) {
    $scope.testdata = true;
}])
app.controller('secondCtr', ['$scope','$rootScope', function($scope, $rootScope) {
    var test = $rootscope.testdata;

}])
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;
}])
第二控制器

app.controller('testCtr', ['$scope','$rootScope', function($scope, $rootScope) {
    $scope.testdata = true;
}])
app.controller('secondCtr', ['$scope','$rootScope', function($scope, $rootScope) {
    var test = $rootscope.testdata;

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

我不确定做这件事的最好方法是什么。任何人谢谢

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

例如:-

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
    });
}]);
同样,这完全取决于控制器的排列方式,而不是传递数据。所以一个控制器可以通知另一个控制器我已经更新了,现在你去拿它。另一个控制器在接收到事件通知时会将依赖注入共享和管理数据的同一个服务,它可以调用该服务并获取更新的数据

同样,使用$rootScope或仅仅使用$scope本身来实现这一点取决于控制器的结构$rootScope.broadcast有助于解决这一问题,但您需要注入$rootScope,这有时会带来不便。但是,最好在任何地方都有相同的实现,而不必担心控制器的结构。在控制器之间共享数据时需要担心的另一件事是,如果您正在传递对象,那么对象的引用将复制到目标上,因此目标上的任何更新都将反映源本身的更改,在某些情况下,这是不可取的,因此您可以在发送数据时在源处复制数据

还请注意,作用域遵循原型继承模式,即所有scopesexcept隔离作用域、$scope.$newtrue都是从其父级继承的,最终它们都是通过原型链从其父级的$rootScope属性集派生而来的


最终,在不同组件之间传递数据、通知、共享/访问数据的方法有很多。

最好的方法是使用服务或工厂。你可以查一下 服务是单例对象,这意味着它们只有一个实例。一旦你在一个控制器中创建了一个服务实例,你就不能在另一个控制器中创建一个新实例,相反,你将获得现有实例的引用,从而可以从多个控制器访问数据


看视频,他比我解释得更好

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