将参数传递给模态

pra*_*upd 93 javascript grails twitter-bootstrap angularjs

我想将登录用户点击userName的列表传递userName给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>
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

那么,我该如何传递userNameencouragementModal

Ali*_*avi 145

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

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

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

app.controller('EditCtrl', ['$scope', '$location'
       , function ($scope, $location, editId)
Run Code Online (Sandbox Code Playgroud)

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

app.controller('EditCtrl', ['$scope', '$location', 'editId'
     , function ($scope, $location, editId)
Run Code Online (Sandbox Code Playgroud)

现在它会顺利工作,我多次遇到同样的问题,一旦注入,一切都开始工作了!


bic*_*cle 56

另一个不起作用.根据文档,这是你应该这样做的方式.

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;
};
Run Code Online (Sandbox Code Playgroud)

见plunkr


小智 50

或者,您可以创建新范围并通过范围选项传递参数

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

在你的模态控制器中传入$ scope,你就不需要传入了itemsProvider或者解决了你命名它的东西

modalController = function($scope) {
    console.log($scope.params)
}
Run Code Online (Sandbox Code Playgroud)

  • +1因为这允许传递数据而无需为模态定义控制器.顺便说一句,你可以做`$ scope.$ new(true)`创建一个新的隔离范围而不需要注入`$ rootScope`. (3认同)
  • $ rootScope $新的().<===这应该被赞成.非常巧妙的把戏.谢谢! (2认同)

Rub*_*ini 22

您还可以通过添加具有模态实例的新属性并将其传递给模态控制器,轻松地将参数传递给模态控制器.例如:

以下是我想要打开模态视图的点击事件.

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

模态控制器:

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


pra*_*upd 17

我尝试如下.

ng-clickEncourage按钮上调用了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>
Run Code Online (Sandbox Code Playgroud)

我设置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' ];
Run Code Online (Sandbox Code Playgroud)

我提供了一个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>
Run Code Online (Sandbox Code Playgroud)

它起作用了,我向自己致敬.

  • 我+1,我向你致敬.如果有人需要将整个用户传递给模态而不是单个字符串作为她的名字,在控制器中,记得使用`angular.copy(user)`. (3认同)

San*_*nda 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();
Run Code Online (Sandbox Code Playgroud)

在你的对话框控制器中:

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

编辑:自新版本的ui对话框以来,解析条目变为:

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

  • 实际上应该是`resolve:function(){return {username:'foo'}}` (3认同)