모달에 매개 변수를 전달하는 방법은 무엇입니까?


96

로그인 한 사용자 userName목록 userName에서 트위터 부트 스트랩으로을 전달하고 싶습니다 modal. angularjs 를 통해 데이터가 렌더링되는 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 년

답변:


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

이 정의되지 않은 오류는 내가 당신의 대답을 볼 때까지 내 머리를하고있었습니다! 매력처럼 작동합니다!
Dan

단순히 var 대신 timeout 개체를 전달하려면 어떻게해야합니까? 타임 아웃의 끝에서 발생하는 제한 시간이 해결되었습니다 전까지 발생하지 않습니다 결의,
Danny22

나는 내 솔루션에서 누락 된 것은 내가 그 인수가 될 문자열 있었다 알고 않았나 .... $ 범위와 간단한 따옴표 사이에 $ 위치를 사용하는 것이 었습니다
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 2014-08-12

1
코멘트 주셔서 감사합니다, Jose, 그것은 정확히 제 문제였습니다. Angular 코드를 축소하는 경우 예, ModalInstanceCtrl에 대한 배열 구문을 사용해야합니다.
mcole 2014-08-29

Jose, +1 그것도 내 문제였습니다. 그리고 AngularUI를 사용하는 모든 사람들을 생각합니다!
마테오 Defanti

50

또는 새 범위를 만들고 범위 옵션을 통해 매개 변수를 전달할 수 있습니다.

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 (); <=== 이것은 찬성되어야합니다. 아주 깔끔한 트릭. 감사!
reflog

3
+1 모달에 대한 컨트롤러를 정의 할 필요없이 데이터를 전달할 수 있기 때문입니다. BTW 당신은 $scope.$new(true)주입 할 필요없이 새로운 격리 된 범위를 만들 수 있습니다 $rootScope.
Santosh

@Mwayi :이 팁에 감사드립니다! 클래식 주입 (사용 resolve) 의 문제 는 인수가 필수이므로 모달을 열 때마다 모든 인수를 해결해야합니다. 그렇지 $modal.open()않으면 컨트롤러 인수를 하기 때문에 호출 이 실패합니다 . 이 깔끔한 scope트릭 을 사용하면 종속성이 선택 사항이됩니다.
stackular

23

또한 모달 인스턴스와 함께 새 속성을 추가하여 모달 컨트롤러에 매개 변수를 쉽게 전달하고 모달 컨트롤러로 가져올 수도 있습니다. 예를 들면 :

다음은 모달보기를 열고 싶은 클릭 이벤트입니다.

 $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...
                }]);

정확히 내가 필요한 것. 완벽하게 작동했습니다.
theFish

17

나는 아래와 같이 시도했다.

Encourage 버튼에서 ng-clickangularjs 컨트롤러를 호출 했습니다 .

               <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>

내가 설정 userNameencouragementModalAngularJS와 컨트롤러에서.

    /**
     * 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' ];

userName에서 angularjs 컨트롤러에서 값을 얻기 위해 place ( )를 제공했습니다 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).
youri

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-dialog의 새 버전부터 해결 항목은 다음과 같습니다.

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


안녕하세요, 저는 이런 식으로 시도하지 않았습니다. 하지만 제안에 +1합니다.
prayagupd

3
실제로 그게되어야합니다resolve: function(){return {username: 'foo'}}
SET

SETs 답변이 작동하지 않습니다. 자전거 바로 아래에 있습니다. 해결해야합니다. {data : function () {return 'foo';}}
bornytm

1
@bornytm 요즘 당신 말이 맞아요. 내 대답이 기록 된 때, 구문했다 :resolve: { username: 'foo'}
산드로 문다

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 부트 스트랩을 사용하지 않는 경우 다음 방법을 사용합니다.

모달의 전체 요소를 포함하는 지시문을 만들고 요소를 다시 컴파일하여 범위를 삽입합니다.

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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.