在模态和控制器之间传递数据

时间:2016-03-01 11:45:34

标签: angularjs modal-dialog angular-ui-bootstrap

如何在控制器中提供数据?我创建了一个非常简单的Plunk,它应该在模态中显示$ scope的数据。然后我需要更新数据,并且只在点击“确定”时更新$ scope。单击“取消”将放弃更改。

但在我开始这一步之前,我需要让范围可用于模态。大多数示例使用两个控制器。我是否需要另一个控制器,如下例所示:Passing Data to Twitter Bootstrap Modal in Angular?在我的控制器中,我有以下内容:

$scope.open = function(){
  var modalInstance = $uibModal.open({
    templateUrl: 'modal.html',
    controller: 'ModalInstanceController',
    resolve: {
      users: function() {
        return $scope.users;
      }
    }
  });
};

如何在模板中显示用户?插件在这里:http://plnkr.co/edit/FuXjSwtljQtFYOtFRV18?p=preview

4 个答案:

答案 0 :(得分:9)

为了能够访问控制器的范围,您需要在创建实例时将范围对象传递给模态:

  $scope.open = function() {
    var modalinstance = $uibModal.open({
      scope: $scope,
      templateUrl: 'modal.html',
      resolve: {
        users: function() {
          return $scope.users;
        }
      }
    })
  };

这样Angular将创建控制器$scope的子范围,这样您就可以访问模态范围内的项目了:

演示http://plnkr.co/edit/0m9oktX2JHFmeiaDfOpO?p=preview

答案 1 :(得分:2)

您可以在模态中访问范围 -

 $scope.open = function(){
    var modalinstance = $uibModal.open({
      templateUrl: 'modal.html',
      scope:$scope

    })
  };

答案 2 :(得分:1)

你可以只使用一个控制器,这只是一个“脏”的解决方案,因为两个html文件将共享同一个控制器,这可能是一个问题。

你面临的问题是在模态中你没有定义scope,所以你正在做的foreach (ng-repeat)没有得到任何元素

您可以通过将modal.html更改为

来轻松修复此问题
<div ng-controller="modalController"><div class="modal-header">
  <h3 class="modal-title">Modal</h3>
</div>
<div class="modal-body">
  <p>Existing users:</p>
  <ul>
    <li ng-repeat="user in users">{{user}}</li>
  </ul>

</div>
<div class="modal-footer">
  <button class="btn btn-default" type="button">Close</button>
</div>
</div>

如你所见,现在这个模态有一个控制器(与主窗口相同),因此会有一个scope

或者只是将范围传递给添加

的模态定义
var modalinstance = $uibModal.open({
      scope: $scope,...

是脏的,你正在“污染”范围,但它有效:)

答案 3 :(得分:0)

如果你想在你的函数必须驻留在ModalInstanceController中的模态上使用任何ng-click,那么这是我当前项目中的一些代码,它按预期工作

app.controller('dashboardCtrl', function ($scope, $rootScope, $location, $http, Data, $uibModal ) {

   $scope.users = '';

  $scope.open = function(){
     var modalInstance = $uibModal.open({
        templateUrl: 'modal.html',
        controller: 'ModalInstanceController',
        resolve: {
           users: function() {
             return $scope.users;
           }
        }
     })
   }
});

app.controller('ModalInstanceController', function ($scope, $uibModal, $uibModalInstance, users, $rootScope, $http, Data) {
  $scope.ok = function () {
    $uibModalInstance.close($scope.selected.item);
  }

  $scope.cancel = function () {
    $uibModalInstance.dismiss('cancel');
  }

  $scope.users = users ;
  $scope.selected = {
   users: $scope.users[0]
  };
});