如何在Angular Material对话框中使用相同的控制器?

时间:2016-01-21 10:31:11

标签: javascript angularjs angular-material

我在我的项目中使用Angular Material。我使用了许多对话框(仅用于警报目的),但我现在需要一个非常复杂的对话框。

这是Angular Material网站使用的示例:

function showDialog($event) {
  var parentEl = angular.element(document.body);
  $mdDialog.show({
    parent: parentEl,
    targetEvent: $event,
    template: '<md-dialog aria-label="List dialog">' +
      '  <md-dialog-content>' +
      '    <md-list>' +
      '      <md-list-item ng-repeat="item in items">' +
      '       <p>Number {{item}}</p>' +
      '      ' +
      '    </md-list-item></md-list>' +
      '  </md-dialog-content>' +
      '  <md-dialog-actions>' +
      '    <md-button ng-click="closeDialog()" class="md-primary">' +
      '      Close Dialog' +
      '    </md-button>' +
      '  </md-dialog-actions>' +
      '</md-dialog>',
    locals: {
      items: $scope.items
    },
    controller: DialogController
  });

  function DialogController($scope, $mdDialog, items) {
    $scope.items = items;
    $scope.closeDialog = function() {
      $mdDialog.hide();
    }
  }
}

相反,是否可以不为controller引用$mdDialog,并且只允许它使用调用它的同一个控制器?

例如,如果通过此按钮调用它,则对话框将只使用MyCtrl控制器,以便对话框可以访问范围变量。

<div ng-controller="MyCtrl">
  <md-button ng-click="showDialog($event)" class="md-raised">
    Custom Dialog
  </md-button>
</div>

这是可能的吗?或者我必须不断使用locals属性和广播来保持来回传递变量吗?

1 个答案:

答案 0 :(得分:28)

如果您使用controllerAs,则可以这样做。我正在用es6这样做:

this.$mdDialog.show({
  targetEvent: event,
  templateUrl: 'path/to/my/template.html',
  controller: () => this,
  controllerAs: 'ctrl'
});

如果没有es6,它将如下所示:

.controller('AppCtrl', function($scope, $mdDialog, $mdMedia) {
    var self = this;

    this.showTabDialog = function(ev) {
        $mdDialog.show({
            controller: function () {
                return self;
            },
            controllerAs: 'ctrl',
            templateUrl: 'tabDialog.tmpl.html',
        });
    };
});

我修改了文档中的基本用法示例: http://codepen.io/kuhnroyal/pen/gPvdPp