将我的复选框与动态选项卡连接起来

Connect my checkboxes with dynamic tabs

我创建了一个列表,其中包含一些项目和每个项目的复选框,如下所示:

    <md-list ng-controller="ListCtrl" class="listControls">

    <md-list-item ng-repeat="account in accounts">
    <md-checkbox ng-model="account.selected" ng-checked="selection.indexOf(account.title) > -1" ng-click="toggleSelection(account.title)"></md-checkbox>
    <p>{{account.title}}</p>        
    </md-list-item>

    </md-list>

我的控制器位于名为 list.js:

的文件中
angular.module('MyApp')
.config(function($mdThemingProvider, $mdIconProvider){
    $mdIconProvider
        .defaultIconSet('img/icons/sets/core-icons.svg', 24);

    $mdThemingProvider.theme('default')
        .primaryPalette('red')
        .accentPalette('red');
    })

.controller('ListCtrl', function($scope, $mdDialog) {
  $scope.accounts = [
    {id: 1, title: "Account A", selected: false},
    {id: 2, title: "Account B", selected: false},
    {id: 3, title: "Account C", selected: false},
  ];
...

在这里我有一个功能,可以让我在其中一个复选框状态发生变化时采取行动。

我希望做的是添加动态选项卡,这些选项卡会在选择项目时出现,否则会消失。

我尝试添加在 angular material 站点中看到的选项卡,并将 javascript 代码保存在名为 tabs.js 的文件中。

我的问题是选项卡创建函数在 tabs.js 中,当复选框更改时做出反应的函数在 list.js 中,因此在不同的控制器中。

我如何连接这两个功能,或者如果这不可行或不可取,那么实现我想要的目标的最佳方法是什么?

EDIT1

Here 是我在没有要集成的 tabs.js 的情况下尝试做的事情。

首先,您应该注意将所有控制器附加到同一个模块

angular.module('yourModuleName', ...)

正如我在您的代码中看到的那样,ListCtrl 在 angular 控制器层次结构中的级别高于选项卡的控制器(我在查看 html 代码时认出它)。因此,在 ListCtrl 中放入范围的所有内容都将在下层控制器中可见。

如果我处在你的位置,我会在 ListCtrl 范围内创建一个空的 JS 对象 {}

.controller('ListCtrl', function($scope, $mdDialog) {
    $scope.tabCtrlMethods = {};

然后在选项卡控制器中附加所需的方法。

您可以使用 Services 在控制器之间共享数据。 参见:https://docs.angularjs.org/guide/services

查看此代码片段,其中 adds/removes 选项卡基于相应的复选框是否被选中。我正在使用 dataSrvclistCtrltabsCtrl

之间共享数据

angular.module('materialApp', ['ngMaterial', 'ngAnimate'])

.service('dataSrvc', [function() {
 var tabData = {
  tabs: [
   {
    'id': 1,
    'label': 'One',
    'selected': true
   },
   {
    'id': 2,
    'label': 'Two',
    'selected': true
   },
   {
    'id': 3,
    'label': 'Three',
    'selected': true
   },
   {
    'id': 4,
    'label': 'Four',
    'selected': true
   },
  ]
 };
 return tabData;
}])

.controller('listCtrl', ['$scope', 'dataSrvc', function($scope, dataSrvc) {
 $scope.items = dataSrvc.tabs;

 $scope.exists = function(item) {
  return $scope.items.indexOf(item) > -1;
 };

 $scope.toggle = function(item) {
  item.selected = !item.selected;
 };
}])

.controller('tabsCtrl', ['$scope', 'dataSrvc', function($scope, dataSrvc) {
 $scope.tabs = dataSrvc.tabs;
}]);
.ma-tabs {
 width: 400px;
}

.ma-tab-content {
 margin-top: 20px;
 text-align: center;
}
<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/0.9.4/angular-material.min.css">
 <link rel="stylesheet" href="main.css">
 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-animate.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-aria.min.js"></script>

    <script src="https://ajax.googleapis.com/ajax/libs/angular_material/0.9.4/angular-material.min.js"></script>
    <script type="text/javascript" src="main.js"></script>
</head>
<body ng-app="materialApp">
 <section ng-controller="listCtrl">
  <div ng-repeat="item in items">
   <md-checkbox ng-checked="item.selected" ng-click="toggle(item)">
    {{ item.id }}
   </md-checkbox>
  </div>
 </section>

 <section ng-controller="tabsCtrl">
  <md-tabs class="ma-tabs">
   <md-tab ng-repeat="tab in tabs"
        ng-if="tab.selected"
     label="{{::tab.label}}">
     <md-content class="ma-tab-content">
      Tab {{::tab.label}} Content
     </md-content>
   </md-tab>
  </md-tabs>
 </section>
</body>
</html>