Modale parametreler nasıl aktarılır?


96

Oturum açmış bir kullanıcı tıklamaları userNamelistesinden userNametwitter önyüklemesine geçmek istiyorum modal. Verilerin angularjs aracılığıyla oluşturulduğu angularjs ile grails kullanıyorum .

Yapılandırma

Benim grails görünüm sayfası encouragement.gspolan

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

Benim encourage/_encouragement_modal.gspise

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

Yani, nasıl geçebilir userNameiçin encouragementModal?


1
Bunları angularjs kullanarak halletmelisiniz. checkout ng-içerir.
— zs2020

Yanıtlar:


149

Parametreyi geçmek için, denetleyicideki öğeleri çözümlemeniz ve enjekte etmeniz gerekir.

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

Şimdi böyle kullanacaksan:

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

bu durumda editId tanımsız olacaktır. Bunu şu şekilde enjekte etmelisin:

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

Şimdi sorunsuz çalışacak, aynı problemle birçok kez karşılaşıyorum, bir kez enjekte edildiğinde her şey çalışmaya başlıyor!


Angular herhangi bir şey gibi, çözüm enjeksiyondur. Teşekkürler!
— Sebastialonso

Bu tanımsız hata, cevabınızı görene kadar kafamı karıştırıyordu! Tıkır tıkır çalışıyor!
— Dan

Basit bir değişken yerine bir zaman aşımı nesnesi geçirmek istiyorsanız nasıl yaparsınız? zaman aşımı çözülene kadar çözüm çalışmayacaktır, bu zaman aşımının sonunda gerçekleşir
— Danny22


1
Bunu yaparken "angular.js: 10071 Hata: [$ injector: unpr] Bilinmeyen sağlayıcı: editIdProvider <- editId" alıyorum. Herhangi bir fikir?
— Oskar Lund

57

Diğeri çalışmıyor. Dokümanlara göre bunu yapmanız gereken yol bu.

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 bakın


1
Bağımlılıkları enjekte etmek için bunu ['$ kapsam', '$ modalInstance', fonksiyon () gibi sarmamalısınız?
— joseramonc

1
Yorum için teşekkürler Jose, bu benim sorunumdu. Angular kodunuzu küçültüyorsanız, evet, ModalInstanceCtrl için dizi sözdizimini kullanmanız gerekir.
— mcole

Jose, +1 Benim de sorunumdu. Ve AngularUI kullanan herkesi düşünüyorum!
— Matteo Defanti

50

Alternatif olarak, yeni bir kapsam oluşturabilir ve kapsam seçeneği aracılığıyla parametrelerden geçebilirsiniz.

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

Modal denetleyicinizde $ kapsam geçtikten sonra, o zaman ve itemsProvider'ı veya adını verdiğiniz şeyi çözmeniz gerekmez.

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

2
$ rootScope. $ new (); <=== buna olumlu oy verilmelidir. çok düzgün bir numara. Teşekkürler!
— 2014 16

3
+1 Çünkü bu, modal için bir kontrolör tanımlamaya gerek kalmadan verilerin geçişine izin verir. BTW $scope.$new(true), enjekte etmeye gerek kalmadan yeni bir izole edilmiş kapsam oluşturmak için yapabilirsiniz $rootScope.
— Santosh

@Mwayi: Bu ipucu için teşekkürler! Klasik enjeksiyon (kullanarak resolve) ile ilgili sorun , bağımsız değişkenlerin zorunlu olmasıdır, bu nedenle bir modal'ı her açtığınızda, tüm bağımsız değişkenleri çözmeniz gerekir, $modal.open()aksi takdirde denetleyici bağımsız değişkenlerini istediğinden çağrı başarısız olur . Bu düzgün scopenumarayı kullanarak bağımlılıklar isteğe bağlı hale gelir.
— yığın

23

Ayrıca, modal örneğine yeni bir özellik ekleyerek ve bunu modal denetleyiciye alarak parametreleri modal denetleyiciye kolayca iletebilirsiniz. Örneğin:

Modal görünümü açmak istediğim tıklama olayım aşağıdadır.

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

Modal Denetleyici:

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

Tam olarak ihtiyacım olan şey. Mükemmel çalıştı.
— theFish

17

Aşağıdaki gibi denedim.

Teşvik Et ng-clickbutonundaki angularjs kontrolörünü aradım ,

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

I set userNamearasında encouragementModalangularjs denetleyicisinden.

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

userNameAngularjs controller'dan değer almak için bir yer ( ) sağladım 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>

İşe yaradı ve kendimi selamladım.


3
+ 1'liyorum ve sizi selamlıyorum. Birinin, denetleyicideki adı için tek bir dizeden ziyade tüm kullanıcıyı kipe geçirmesi gerekiyorsa, kullanmayı unutmayın angular.copy(user).
— youri

10

Bu ihtiyaçlar için gerçekten Angular UI kullanmalısınız. Şuna bakın : Açısal Kullanıcı Arayüzü İletişim Kutusu

Özetle, Angular UI iletişim kutusu ile, değişkenleri bir denetleyiciden iletişim denetleyicisine kullanarak iletebilirsiniz resolve. İşte "gönderen" denetleyiciniz:

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

Ve iletişim denetleyicinizde:

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

DÜZENLE: UI iletişim kutusunun yeni sürümünden bu yana, çözümleme girişi şöyle olur:

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


Merhaba ben bu şekilde denemedim. Ancak bir öneri için +1.
— 2013

3
aslında bu olmalıdırresolve: function(){return {username: 'foo'}}
— SET

SET'lerin cevabı işe yaramayacak. bisikletin hemen altında, şu çözülmesi gerekiyor: {data: function () {return 'foo';}}
— bornytm

1
@bornytm Bugünlerde haklısın. Ancak cevabım yazıldığında sözdizimi şöyleydi:resolve: { username: 'foo'}
— Sandro Munda

4

Basitçe bir denetleyici işlevi oluşturabilir ve parametrelerinizi $ kapsam nesnesiyle iletebilirsiniz.

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

1

AngularJS UI Bootstrap kullanmıyorsanız, işte böyle yaptım.

Modal'inizin tüm bu öğesini tutacak ve kapsamınızı ona eklemek için öğeyi yeniden derleyecek bir yönerge oluşturdum.

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

Modal şablonunuzun denetleyicinizin kapsamında olduğunu varsayıyorum, ardından şablonunuza my-modal yönergesi ekleyin . Tıklanan kullanıcıyı $ kapsam.aModel'e kaydettiyseniz , orijinal şablon şimdi çalışacaktır.

Not: Tüm kapsam artık modalınız tarafından görülebilir, böylece içindeki $cope.users'a da erişebilirsiniz .

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.