Javascript 在控制器之间共享范围变量的最佳实践是什么?

Javascript 在控制器之间共享范围变量的最佳实践是什么?,javascript,angularjs,Javascript,Angularjs,我有一个变量数组(我称之为ArrVar),它通过一个服务可供所有控制器使用。此变量已在CtrlA中作为作用域变量分配为$scope.ArrVar。如果用户切换CtrlA下的按钮,则附加到CtrlA的方法将更改$scope.ArrVar,更新服务中的变量,并使用ng repeat显示列表 但我有一个完全独立的控制器CtrlB,它需要对CtrlA下的scope变量进行更改,而CtrlB无法访问该变量 我可以想出两种解决办法: 全局控制器 在根范围分配变量 但这两种方法似乎都不是最好的做法。还有其他优

我有一个变量数组(我称之为ArrVar),它通过一个服务可供所有控制器使用。此变量已在CtrlA中作为作用域变量分配为$scope.ArrVar。如果用户切换CtrlA下的按钮,则附加到CtrlA的方法将更改$scope.ArrVar,更新服务中的变量,并使用ng repeat显示列表

但我有一个完全独立的控制器CtrlB,它需要对CtrlA下的scope变量进行更改,而CtrlB无法访问该变量

我可以想出两种解决办法:

  • 全局控制器
  • 在根范围分配变量

  • 但这两种方法似乎都不是最好的做法。还有其他优雅的方式吗?两个控制器是完全不同的,因此合并无法实现。如果共享obj特定的数据(如element position data.msg),则它将与服务绑定,而不进行监视或任何操作

    app.controller('FirstCtrl',函数($scope,Shared){
    $scope.data=共享;
    })
    .controller('SecondCtrl',函数($scope,Shared){
    $scope.data=共享;
    })
    .factory('共享',函数(){
    返回{msg:['one','two','three']}
    });
    {{data}}
    {{data}}
    
    我认为大多数人通常使用共享服务。此站点上有几个关于它们的问题。但是不允许服务更新范围变量。CtrlB可以通过使用该服务接收新更新的ArrVar,但它无权访问$scope.ArrVar,它在CtrlAYou的范围内。您可以更新属于共享服务的变量,并从控制器查看该变量。当该值发生变化时,CtrlB可以执行一个操作,更新CtrlA正在监视的另一个sharedService变量,然后触发另一个操作。您不能通过在CtrlB中初始化CtrlA实例从CtrlB访问Arr.Var吗?谢谢Dylan,但我尝试过这种方法,但数组没有立即更新。事实上,每个函数调用之间都有一个延迟,因此前一个函数调用结果将传递给作用域。。。(这可能是因为scope变量在函数完成新的执行之前已更新)我已尝试运行$scope。$apply manually,但我收到一个错误,表示它已在运行中。我不得不使用$timeout来阻止它如此工作。如果您正在等待某个事件完成,那么该控制器可能需要$watch,但这不会破坏2的初始绑定。如果没有一个例子,很难说是不是放了一把,我终于明白了。简而言之,服务中的ArrVar是在一个API调用中更新的,因此我必须使用$apply进行即时更新。非常感谢!
    app.controller('FirstCtrl', function($scope, Shared) {
      $scope.data = Shared;
    })
    .controller('SecondCtrl', function($scope, Shared) {
      $scope.data = Shared;
    })
    .factory('Shared', function() {
      return { msg : ['one','two','three'] }
    });
    
       <div ng-controller="FirstCtrl">
          <input ng-model="data.msg"/>
          {{data}}
       </div>    
       <div ng-controller="SecondCtrl">
          <input ng-model="data.msg"/>
         {{data}}
       </div>