【问题标题】:Inject controller with resolve parameters注入带有解析参数的控制器
【发布时间】:2015-12-10 19:39:45
【问题描述】:

我正在使用角度材料 (AM),我想将外部控制器传递给 $mdDialog。 在 AM 文档中,我们创建这样的对话框:

function DialogController($scope, $mdDialog) { ... }
...
$mdDialog.show({
  controller: DialogController,
  templateUrl: 'dialog1.tmpl.html',
  parent: angular.element(document.body),
  targetEvent: ev,
  clickOutsideToClose:true
})

如您所见,控制器只是当前控制器中调用 $mdDialog 的一个函数。我想使用外部控制器。

myApp.controller('ElementEditCtrl', function($scope, 
$rootScope, $stateParams, $filter, $state, ElementsService, element, personnes) { ... }

如您所见,我对参数有一些决心。目前我正在使用 $controller 服务来实例化我的控制器:

var ctrl = $scope.$new();
    $controller('ElementEditCtrl', {$scope: ctrl, personnes: EmployesService.get(), element: angular.copy($scope.element)});
    $mdDialog.show({
        controller: ctrl,
        templateUrl: 'FrontEnd/App/views/ElementEditView.html',
        parent: angular.element(document.body),
        targetEvent: ev,
        clickOutsideToClose: true,
    })

我的浏览器控制台中出现此错误:

错误:ng:areq 错误参数 参数 'fn' 不是函数,得到 n

我需要使用外部控制器,因为我需要从不同的视图打开此对话框,并且我不想在每个控制器中复制代码。

【问题讨论】:

  • 你能公开一个简单的 plunker 来重现你得到的相同错误吗?

标签: javascript angularjs angular-material


【解决方案1】:

制作一个服务并公开这个功能:

function createDialog($scope) {
  return function() {
    $mdDialog.show({
      scope: $scope.$new(),
      templateUrl: 'some/temmplate.html,
      clickOutsideToClose: true
    });
  };

然后只需粘贴创建对话框的控制器的范围。

【讨论】:

  • 如何将外部控制器传递给对话框构造函数?
  • 在您的外部控制器中传递一个 $scope 到 createDialog 函数,然后对话框将可以访问所有范围属性。如果您使用 controllerAs 语法创建了控制器(比如说 controllerAs: 'vm'),您可以使用 vm 从对话框模板访问它。因此,如果您的控制器中有 this.title = 'My controller' 您可以使用 vm.title 访问它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 2018-10-27
  • 2016-05-04
  • 2011-11-04
  • 2021-08-29
  • 1970-01-01
相关资源
最近更新 更多