モーダルにパラメーターを渡す方法は?


96

ログインしたユーザーがクリックしたsaのuserNameリストからuserNameをtwitterブートストラップに渡したいのですがmodal。私が使用していますGrailsのをして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

回答:


149

パラメータを渡すには、コントローラでアイテムを解決して挿入する必要があります

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

今それはスムーズに機能します、私は何度も同じ問題に直面します、注入されると、すべてが機能し始めます!


どんな角度でも、注射が解決策です。ありがとう!
Sebastialonso

この未定義のエラーは、あなたの答えが見つかるまで頭を悩ませていました!魅力的な作品!
Dan

単にvarの代わりにタイムアウトオブジェクトを渡したい場合はどうしますか?解決は、タイムアウトが解決されるまで発生しません。これは、タイムアウトの最後に発生します
Danny22

私のソリューションで欠けていたのは、単純な引用符の間に$ scopeと$ locationを使用することでした...これらの引数が文字列である必要があることを知りません
でした

1
これを行うと、「angular.js:10071エラー:[$ injector:unpr]不明なプロバイダー:editIdProvider <-editId」が表示されます。何か案は?
Oskar Lund

57

もう1つは機能しません。ドキュメントによると、これはあなたがそれを行うべき方法です。

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 14

1
コメントをありがとう、ホセ、それはまさに私の問題でした。Angularコードを縮小する場合は、はい、ModalInstanceCtrlの配列構文を使用する必要があります。
mcole 2014

ホセ、+ 1それも私の問題でした。そして、AngularUIを使用している皆さんのことを考えています!
Matteo Defanti 2015

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 2014

3
+1これにより、モーダルのコントローラを定義する必要なくデータを渡すことができます。ところで$scope.$new(true)、注入する必要なしに、新しい分離されたスコープを作成することができます$rootScope
Santosh、2015

@Mwayi:このヒントをありがとう!クラシックインジェクションの問題(を使用resolve)は、引数が必須であるため、モーダルを開くたびにすべての引数を解決する必要あります。そうし$modal.open()ないと、コントローラー引数を必要とするため、呼び出しが失敗します。このきちんとしたscopeトリックを使用することにより、依存関係はオプションになります。
スタック型の2015

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

10

そのためには、Angular UIを実際に使用する必要があります。確認する:Angular UI Dialog

簡単に言えば、Angular UIダイアログでは、を使用して、コントローラーからダイアログコントローラーに変数を渡すことができますresolve。これが「from」コントローラです。

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エントリは次のようになります。

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


こんにちは、私はこの方法を試しませんでした。しかし、提案のために+1。
prayagupd 2013

3
実際にはそれがresolve: function(){return {username: 'foo'}}
SET

SETの答えは機能しません。自転車はすぐ下にあります。解決する必要があります。{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 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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.