Làm thế nào để chuyển các tham số cho một phương thức?


96

Tôi muốn chuyển userNametừ danh sách userNamengười dùng đã đăng nhập bị nhấp vào twitter bootstrap modal. Tôi đang sử dụng grails với anglejs , nơi dữ liệu được hiển thị thông qua anglejs .

Cấu hình

Trang xem grails của tôi 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>

Của tôi 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>

Vì vậy, làm thế nào tôi có thể vượt qua userNameđể encouragementModal?


1
Bạn nên xử lý những điều này bằng cách sử dụng anglejs. kiểm tra ng-bao gồm.
zs2020

Câu trả lời:


149

Để chuyển tham số, bạn cần sử dụng giải quyết và chèn các mục trong bộ điều khiển

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

Bây giờ nếu bạn sẽ sử dụng như thế này:

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

trong trường hợp này, editId sẽ không được xác định. Bạn cần phải tiêm nó, như thế này:

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

Bây giờ nó sẽ hoạt động trơn tru, tôi phải đối mặt với cùng một vấn đề nhiều lần, một khi được tiêm, mọi thứ bắt đầu hoạt động!


Như bất cứ điều gì Angular, tiêm là giải pháp. Cảm ơn!
Sebastialonso

lỗi không xác định này đã làm tôi đau đầu cho đến khi tôi thấy câu trả lời của bạn! Hoạt động như một sự quyến rũ!
Dan

Làm thế nào để bạn làm nếu thay vì một var đơn giản, bạn muốn chuyển một số đối tượng timeout? giải quyết sẽ không kích hoạt cho đến khi thời gian chờ đã được giải quyết, điều này xảy ra vào cuối thời gian chờ
Danny22

Điều tôi còn thiếu trong giải pháp của mình là sử dụng $ scope và $ location giữa các dấu ngoặc kép đơn giản .... Tôi không biết những đối số đó phải là chuỗi
rshimoda 15/02/16

1
Làm điều này, tôi nhận được "angle.js: 10071 Lỗi: [$ injectionor: unr] Nhà cung cấp không xác định: editIdProvider <- editId". Có ý kiến ​​gì không?
Oskar Lund

57

Cái kia không hoạt động. Theo các tài liệu đây là cách bạn nên làm.

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

Xem plunkr


1
Bạn không nên bao bọc điều này như ['$ scope', '$ modalInstance', function () để chèn các phụ thuộc?
joseramonc

1
Cảm ơn vì nhận xét, Jose, đó chính xác là vấn đề của tôi. Nếu bạn đang giảm thiểu mã Angular của mình, có, bạn phải sử dụng cú pháp mảng cho ModalInstanceCtrl.
mcole

Jose, +1 Đó cũng là vấn đề của tôi. Và tôi nghĩ về tất cả mọi người đang sử dụng AngularUI!
Matteo Defanti

50

Ngoài ra, bạn có thể tạo một phạm vi mới và chuyển qua các tham số thông qua tùy chọn phạm vi

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

Trong thẻ điều khiển phương thức của bạn trong $ scope, sau đó bạn không cần phải chuyển vào và itemsProvider hoặc những gì bạn đã đặt tên cho nó

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

2
$ rootScope. $ new (); <=== điều này sẽ được ủng hộ. thủ thuật rất gọn gàng. cảm ơn!
reflog

3
+1 Vì điều này cho phép truyền dữ liệu mà không cần phải xác định bộ điều khiển cho phương thức. BTW bạn chỉ có thể làm $scope.$new(true)để tạo một phạm vi cô lập mới mà không cần phải tiêm $rootScope.
Santosh

@Mwayi: Cảm ơn vì mẹo này! Vấn đề với việc tiêm truyền cổ điển (sử dụng resolve) là các đối số là bắt buộc vì vậy mỗi khi bạn mở một phương thức, bạn phải giải quyết tất cả các đối số nếu không lệnh gọi tới $modal.open()sẽ thất bại vì bộ điều khiển muốn đối số của nó. Bằng cách sử dụng scopethủ thuật gọn gàng này , các phụ thuộc trở thành tùy chọn.
xếp chồng lên nhau

23

Bạn cũng có thể dễ dàng chuyển các tham số đến bộ điều khiển phương thức bằng cách thêm một thuộc tính mới với phiên bản của phương thức và đưa nó vào bộ điều khiển phương thức. Ví dụ:

Sau đây là sự kiện nhấp chuột của tôi mà tôi muốn mở chế độ xem phương thức.

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

Bộ điều khiển phương thức:

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

Chính xác những gì tôi cần. Hoạt động hoàn hảo.
theFish

17

Tôi đã thử như dưới đây.

Tôi đã gọi ng-clickđến bộ điều khiển anglejs trên nút Khuyến khích ,

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

Tôi thiết lập userNamecác encouragementModaltừ angularjs điều khiển.

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

Tôi đã cung cấp một nơi ( userName) để nhận giá trị từ bộ điều khiển anglejs 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>

Nó hoạt động và tôi tự chào mình.


3
Tôi +1 và tôi chào bạn. Nếu ai đó cần chuyển toàn bộ người dùng đến phương thức thay vì một chuỗi đơn lẻ cho tên của cô ấy, trong bộ điều khiển, hãy nhớ sử dụng angular.copy(user).
youri

10

Bạn thực sự nên sử dụng Angular UI cho nhu cầu đó. Hãy khám phá: Hộp thoại Angular UI

Tóm lại, với hộp thoại Angular UI, bạn có thể chuyển biến từ bộ điều khiển sang bộ điều khiển hộp thoại bằng cách sử dụng resolve. Đây là bộ điều khiển "từ" của bạn:

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();

Và trong bộ điều khiển hộp thoại của bạn:

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

CHỈNH SỬA: Kể từ phiên bản mới của hộp thoại ui, mục giải quyết sẽ trở thành:

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


Xin chào, tôi đã không thử cách này. Nhưng +1 cho một đề xuất.
Prayagupd

3
thực sự cần đượcresolve: function(){return {username: 'foo'}}
SET

Câu trả lời SET sẽ không hoạt động. xe đạp có nó ngay bên dưới, cần giải quyết: {data: function () {return 'foo';}}
sinhytm

1
@bornytm Ngày nay, bạn đã đúng. Nhưng khi câu trả lời của tôi được viết ra, cú pháp là:resolve: { username: 'foo'}
Sandro Munda

4

Bạn có thể chỉ cần tạo một funciton bộ điều khiển và chuyển các tham số của mình với đối tượng $ scope.

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

1

Nếu bạn không sử dụng AngularJS UI Bootstrap, đây là cách tôi đã làm.

Tôi đã tạo một chỉ thị sẽ giữ toàn bộ phần tử đó trong phương thức của bạn và biên dịch lại phần tử để đưa phạm vi của bạn vào đó.

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

Tôi giả sử mẫu phương thức của bạn nằm trong phạm vi bộ điều khiển của bạn, sau đó thêm chỉ thị my-modal vào mẫu của bạn. Nếu bạn đã lưu người dùng được nhấp vào $ scope.aModel , thì mẫu ban đầu bây giờ sẽ hoạt động.

Lưu ý: Toàn bộ phạm vi hiện được hiển thị cho phương thức của bạn, do đó bạn cũng có thể truy cập $ scope.users trong đó.

<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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.