13

我正在使用 controllerAs 语法来避免在我的控制器中出现 $scope 汤,并且还使用 ui.bootstrap 来呈现模态视图。

我需要打开一个与当前控制器共享相同范围的 modalInstace。注入作用域时,您可能会执行以下操作:

var modalInstance = $uibModal.open({
      templateUrl: 'addEditModal.html',
      scope: $scope
    });

但是,由于我没有注入作用域,而是使用了 controllerAs 语法,所以这不起作用。

根据我的发现,您将需要使用 resolve 来传递数据,但您必须通过函数显式传递它。有没有办法通过整个范围?

在该模式中我需要做很多事情,并且传递大量数据似乎过大了。

不想这样做,因为它看起来很乱......

var modalInstance = $modal.open({
  templateUrl: 'myModalContent.html',
  controller: 'ModalInstanceCtrl',
  resolve: {
    user: function() {
        return vm.user;
    },
    something: function() {
        return vm.something;
    },
    blah: function() {
        return blah;
    }
  }
});

有更好的想法吗?

4

2 回答 2

15

我需要打开一个与当前控制器共享相同范围的 modalInstace。

模态服务创建继承范围。和

var modalInstance = $uibModal.open({
  templateUrl: 'addEditModal.html',
  scope: $scope
});

不注入作用域,但指定模态控制器的父作用域(否则根作用域将用作父作用域)。

由于在父控制器上使用了 controllerAs,因此模态控制器将可以访问vm其范围内的继承对象。

于 2015-10-16T07:08:06.877 回答
8

不确定我是否理解正确,但我通过在解析参数中传递/注入当前的“controllerAs”来使其工作

var modalInstance = $uibModal.open({
      templateUrl: 'addEditModal.html',
      controller: 'AudioItemAddEditCtrl as vm',
      resolve: {
        parent: function(){
            return vm
        }
    }
    });

然后,在 AudioItemAddEditCtrl...

var AudioItemAddEditCtrl = function(parent, AudioItemService, $ModalInstance) {
...
}

然后我可以使用'parent'直接访问父控制器范围。

希望这对其他人有帮助。

于 2015-10-17T03:34:30.410 回答