使用自定义控制器在不同视图中共享范围

Dan*_*alo 5 javascript angularjs angular-ui-router

我有下一个问题,我想找到一个解决方案,或者我是否应该像我一样这样做.

我有以下ui-router配置:

$stateProvider.state('ListCounterparties', {
    url:"/counterparties",
    data: { NavMenuItem : 'Counterparties / Desks' },
    views: {
        '' : {
            templateUrl:"./app/module_Counterparties/templates/ListCounterparties.html",
            controller:"CounterpartiesControllerCtrl"
        },
        'deskLists@ListCounterparties' : {
            templateUrl : './app/module_Counterparties/templates/DesksDualListTemplate.html',
            controller:'DesksControllerCtrl'
        }
}
Run Code Online (Sandbox Code Playgroud)

第一个未命名的视图有一个表,我可以从中选择一行,然后调用一个方法从第二个视图填充双列表.

到目前为止,我已经在同一个控制器中,但控制器变得太大,我决定我必须将它们分开.

该方法来填充双列出" deskLists @ ListCounterparties "中被定义DesksControllerCtrl,但它应该被称为CounterpartiesControllerCtrl,为行选择的情况下,在该控制器.

问题是范围不共享,并且该方法对于未命名的视图是不可访问的.

访问DesksControllerCtrl中的范围我可以看到访问$ parent属性两次我可以到达CounterpartiesControllerCtrl,但我不认为这是理想的事情.

提前致谢.

Don*_*uwe 3

在多个控制器之间共享数据、方法等,Angular 的方式是创建服务。这意味着,您创建一个服务来保存您的所有数据,另一个服务为多个控制器提供功能。然后,将inject它们放入您的控制器中:

var myApp = angular.module('myApp', []);

myApp.factory('myGlobalData', function() {
  return {
    data: 1
  };
});

myApp.factory('myService', function(myGlobalData) {
  return {
    increment: function() {
      myGlobalData.data++;
    }
  };
});

myApp.controller('MyCtrlA', function($scope, myGlobalData, myService) {
  $scope.myGlobalData = myGlobalData;
  $scope.myService = myService;
});

myApp.controller('MyCtrlB', function($scope, myGlobalData, myService) {
  $scope.myGlobalData = myGlobalData;
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp">

  <p ng-controller="MyCtrlA">
    {{myGlobalData.data}}
  </p>

  <p ng-controller="MyCtrlB">
    {{myGlobalData.data}}
  </p>

  <div ng-controller="MyCtrlA">
    <button ng-click="myService.increment()">Increment data in myGlobalData service</button>
  </div>

</div>
Run Code Online (Sandbox Code Playgroud)