如何将参数传递给模态?


96

我想将登录用户点击userNameuserNamesa 列表中的传递给twitter bootstrap modal。我在与angularjs一起使用grails,其中数据是通过angularjs呈现的。

组态

我的grails视图页面encouragement.gsp

<div ng-controller="EncouragementController">
    <g:render template="encourage/encouragement_modal" />
    <tr ng-cloak
                  ng-repeat="user in result.users">
                   <td>{{user.userName}}</rd>
                   <td>
                      <a class="btn btn-primary span11" href="#encouragementModal" data-toggle="modal">
                            Encourage
                       </a>
                  </td>
                </tr>

我的encourage/_encouragement_modal.gsp

<div id="encouragementModal" class="modal hide fade">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal"
      aria-hidden="true">&times;</button>
    <h3>Confirm encouragement?</h3>
  </div>
  <div class="modal-body">
      Do you really want to encourage <b>{{aModel.userName}}</b>?
  </div>
  <div class="modal-footer">
    <button class="btn btn-info"
      ng-click="encourage('${createLink(uri: '/encourage/')}',{{aModel.userName}})">
      Confirm
    </button>
    <button class="btn" data-dismiss="modal" aria-hidden="true">Never Mind</button>
  </div>
</div>

所以,我怎么能传递userNameencouragementModal


1
您应该使用angularjs处理这些事情。检出ng-include。
zs2020 2013年

Answers:


149

要传递参数,您需要使用resolve并将项目注入控制器

$scope.Edit = function (Id) {
   var modalInstance = $modal.open({
      templateUrl: '/app/views/admin/addeditphone.html',
      controller: 'EditCtrl',
      resolve: {
         editId: function () {
           return Id;
         }
       }
    });
}

现在,如果您将像这样使用:

app.controller('EditCtrl', ['$scope', '$location'
       , function ($scope, $location, editId)

在这种情况下,editId将是未定义的。您需要注入它,像这样:

app.controller('EditCtrl', ['$scope', '$location', 'editId'
     , function ($scope, $location, editId)

现在它可以正常工作,很多时候我都遇到相同的问题,一旦注入,一切都会开始工作!


与任何Angular一样,注入就是解决方案。谢谢!
Sebastialonso

这个不确定的错误一直困扰着我,直到我看到你的答案!奇迹般有效!

如果要传递某个超时对象而不是简单的var,该怎么办?直到超时已解决(直到超时结束),解析才会触发
Danny22

我在解决方案中缺少的是在简单引号之间使用$ scope和$ location...。我不知道这些参数必须是字符串
rshimoda

1
这样做,我得到“ angular.js:10071错误:[$ injector:unpr]未知提供程序:editIdProvider <-editId”。有任何想法吗?
Oskar Lund

57

另一个不起作用。根据文档,这是您应该这样做的方法。

angular.module('plunker', ['ui.bootstrap']);
var ModalDemoCtrl = function ($scope, $modal) {

    var modalInstance = $modal.open({
      templateUrl: 'myModalContent.html',
      controller: ModalInstanceCtrl,
      resolve: {
        test: function () {
          return 'test variable';
        }
      }
    });
};

var ModalInstanceCtrl = function ($scope, $modalInstance, test) {

  $scope.test = test;
};

见plunkr


1
您不应该像['$ scope','$ modalInstance',function()这样包装来注入依赖项吗?
joseramonc

1
感谢您的评论,Jose,这正是我的问题。如果要缩小Angular代码,可以,必须对ModalInstanceCtrl使用数组语法。
mcole 2014年

何塞+1这也是我的问题。我想到使用AngularUI的每个人!
Matteo Defanti

50

另外,您可以创建一个新的范围并通过scope选项传递参数

var scope = $rootScope.$new();
 scope.params = {editId: $scope.editId};
    $modal.open({
        scope: scope,
        templateUrl: 'template.html',
        controller: 'Controller',
    });

在您的模态控制器中传递$ scope时,您就不需要传递和itemsProvider或曾经解析过的名称了

modalController = function($scope) {
    console.log($scope.params)
}

2
$ rootScope。$ new(); <===这应该被赞成。很整齐的把戏。谢谢!
2014年

3
+1,因为这允许传递数据,而不必为模态定义控制器。顺便说一句,您只$scope.$new(true)需要创建一个新的隔离范围即可,而无需注入$rootScope
桑托什2015年

@Mwayi:感谢您的提示!与传统的注射(使用的问题resolve)是一个参数是强制性这样每次打开一个模式的时候,你必须解决所有的参数或调用$modal.open(),因为控制器将无法它的参数。通过使用这种巧妙的scope技巧,依赖项成为可选的。
堆叠

23

您还可以通过添加带有modal实例的新属性并将其获取到modal controller来轻松地将参数传递给modal controller。例如:

以下是我要在其上打开模式视图的click事件。

 $scope.openMyModalView = function() {
            var modalInstance = $modal.open({
                    templateUrl: 'app/userDetailView.html',
                    controller: 'UserDetailCtrl as userDetail'
                });
                // add your parameter with modal instance
                modalInstance.userName = 'xyz';
        };

模态控制器:

angular.module('myApp').controller('UserDetailCtrl', ['$modalInstance',
                function ($modalInstance) {
                    // get your parameter from modal instance
                    var currentUser = $modalInstance.userName;
                    // do your work...
                }]);

正是我所需要的。工作完美。

17

我尝试如下。

ng-click鼓励按钮上打电话给angularjs控制器,

               <tr ng-cloak
                  ng-repeat="user in result.users">
                   <td>{{user.userName}}</rd>
                   <td>
                      <a class="btn btn-primary span11" ng-click="setUsername({{user.userName}})" href="#encouragementModal" data-toggle="modal">
                            Encourage
                       </a>
                  </td>
                </tr>

我设置userNameencouragementModal从angularjs控制器。

    /**
     * Encouragement controller for AngularJS
     * 
     * @param $scope
     * @param $http
     * @param encouragementService
     */
    function EncouragementController($scope, $http, encouragementService) {
      /**
       * set invoice number
       */
      $scope.setUsername = function (username) {
            $scope.userName = username;
      };
     }
    EncouragementController.$inject = [ '$scope', '$http', 'encouragementService' ];

我提供了一个place(userName)来从angularjs控制器获取价值encouragementModal

<div id="encouragementModal" class="modal hide fade">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal"
      aria-hidden="true">&times;</button>
    <h3>Confirm encouragement?</h3>
  </div>
  <div class="modal-body">
      Do you really want to encourage <b>{{userName}}</b>?
  </div>
  <div class="modal-footer">
    <button class="btn btn-info"
      ng-click="encourage('${createLink(uri: '/encourage/')}',{{userName}})">
      Confirm
    </button>
    <button class="btn" data-dismiss="modal" aria-hidden="true">Never Mind</button>
  </div>
</div>

它奏效了,我向自己致敬。


3
我+1,我向你致敬。如果有人需要将整个用户传递给模式用户,而不是将单个用户名传递给她,请在控制器中记住使用angular.copy(user)
youi

10

您确实应该为此使用Angular UI。签出:Angular UI对话框

简而言之,在Angular UI对话框中,您可以使用将变量从控制器传递到对话框控制器resolve。这是您的“发件人”控制器:

var d = $dialog.dialog({
  backdrop: true,
  keyboard: true,
  backdropClick: true,
  templateUrl:  '<url_of_your_template>',
  controller: 'MyDialogCtrl',
  // Interesting stuff here.
  resolve: {
    username: 'foo'
  }
});

d.open();

在对话框控制器中:

angular.module('mymodule')
  .controller('MyDialogCtrl', function ($scope, username) {
  // Here, username is 'foo'
  $scope.username = username;
}

编辑:由于ui对话框的新版本,解决条目变为:

resolve: { username: function () { return 'foo'; } }


嗨,我没有这样尝试。但建议+1。
prayagupd

3
实际上应该是resolve: function(){return {username: 'foo'}}
设置

SET答案无效。自行车有它正下方,它应该是─决心:{数据:功能(){返回“富”;}}
bornytm

1
@bornytm现在你是对的。但是当我写完答案时,语法为:resolve: { username: 'foo'}
Sandro Munda 2014年

4

您可以简单地创建一个控制器功能,并使用$ scope对象传递您的参数。

$scope.Edit = function (modalParam) {
var modalInstance = $modal.open({
      templateUrl: '/app/views/admin/addeditphone.html',
      controller: function($scope) {
        $scope.modalParam = modalParam;
      }
    });
}

1

如果您不使用AngularJS UI Bootstrap,请按照以下步骤操作。

我创建了一条指令,该指令将保留模态的整个元素,然后重新编译该元素以将范围注入其中。

angular.module('yourApp', []).
directive('myModal',
       ['$rootScope','$log','$compile',
function($rootScope,  $log,  $compile) {
    var _scope = null;
    var _element = null;
    var _onModalShow = function(event) {
        _element.after($compile(event.target)(_scope));
    };

    return {
        link: function(scope, element, attributes) {
            _scope = scope;
            _element = element;
            $(element).on('show.bs.modal',_onModalShow);
        }
    };
}]);

我假设您的模态模板在控制器的范围内,然后将指令my-modal添加到您的模板中。如果将单击的用户保存到$ scope.aModel,则原始模板现在可以使用。

注意:整个作用域现在对您的模式是可见的,因此您还可以在其中访问$ scope.users

<div my-modal id="encouragementModal" class="modal hide fade">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal"
      aria-hidden="true">&times;</button>
    <h3>Confirm encouragement?</h3>
  </div>
  <div class="modal-body">
      Do you really want to encourage <b>{{aModel.userName}}</b>?
  </div>
  <div class="modal-footer">
    <button class="btn btn-info"
      ng-click="encourage('${createLink(uri: '/encourage/')}',{{aModel.userName}})">
      Confirm
    </button>
    <button class="btn" data-dismiss="modal" aria-hidden="true">Never Mind</button>
  </div>
</div>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.