จะส่งพารามิเตอร์ไปยังโมดอลได้อย่างไร?


96

ฉันต้องการที่จะผ่านuserNameจากรายการของuserNameSA 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>

แล้วจะผ่านuserNameไปได้encouragementModalอย่างไร?


1
คุณควรจัดการสิ่งเหล่านี้โดยใช้ angularjs เช็คเอาต์รวม
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

ข้อผิดพลาดที่ไม่ได้กำหนดนี้กำลังทำให้ฉันเข้ามาจนกระทั่งฉันเห็นคำตอบของคุณ! ใช้งานได้เหมือนมีเสน่ห์!
แดน

คุณจะทำอย่างไรถ้าแทนที่จะเป็นเพียงแค่ var ที่คุณต้องการส่งผ่านวัตถุระยะหมดเวลา? การแก้ไขจะไม่เริ่มทำงานจนกว่าการหมดเวลาจะได้รับการแก้ไขซึ่งจะเกิดขึ้นเมื่อสิ้นสุดการหมดเวลา
Danny22

สิ่งที่ฉันขาดหายไปในโซลูชันของฉันคือการใช้ $ scope และ $ location ระหว่างเครื่องหมายคำพูดธรรมดา ๆ .... ฉันไม่รู้ว่าอาร์กิวเมนต์เหล่านั้นต้องเป็นสตริง
rshimoda

1
การทำเช่นนี้ฉันได้รับ "angular.js: 10071 Error: [$ injector: unpr] Unknown provider: 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 () เพื่อฉีด dependencies?
joseramonc

1
ขอบคุณสำหรับความคิดเห็น Jose นั่นคือปัญหาของฉัน หากคุณกำลังย่อขนาดโค้ด Angular ใช่คุณต้องใช้ไวยากรณ์อาร์เรย์สำหรับ ModalInstanceCtrl
mcole

Jose, +1 มันก็เป็นปัญหาของฉันเหมือนกัน และฉันนึกถึงทุกคนที่ใช้ AngularUI!
Matteo Defanti

50

หรือคุณสามารถสร้างขอบเขตใหม่และส่งผ่านพารามิเตอร์ผ่านตัวเลือกขอบเขต

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

ในตัวควบคุมโมดอลของคุณผ่านใน $ ขอบเขตคุณไม่จำเป็นต้องส่งผ่านและ itemsProvider หรือสิ่งที่เคยแก้ปัญหาที่คุณตั้งชื่อมัน

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

2
$ rootScope. $ ใหม่ (); <=== สิ่งนี้ควรได้รับการโหวต เคล็ดลับที่เรียบร้อยมาก ขอบคุณ!
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';
        };

ตัวควบคุม Modal:

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

สิ่งที่ฉันต้องการ ทำงานได้อย่างสมบูรณ์แบบ
theFish

17

ฉันพยายามตามด้านล่าง

ฉันโทรng-clickไปที่ตัวควบคุม 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>

ผมตั้งuserNameของencouragementModalจากตัวควบคุม 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' ];

ฉันมีให้สถานที่ ( userName) 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 สำหรับความต้องการนั้นจริงๆ ลองดู: โต้ตอบ UI เชิงมุม

ในการสรุปด้วยโต้ตอบเชิงมุม 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 รายการแก้ไขจะกลายเป็น:

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


สวัสดีฉันไม่ได้ลองวิธีนี้ แต่ +1 สำหรับคำแนะนำ
Prayagupd

3
ที่จริงควรจะเป็นresolve: function(){return {username: 'foo'}}
SET

คำตอบ SET ไม่ทำงาน จักรยานมีอยู่ด้านล่างควรแก้ไข: {data: function () {return 'foo';}}
bornytm

1
@bornytm ทุกวันนี้คุณพูดถูก แต่เมื่อคำตอบของฉันถูกเขียนไวยากรณ์คือ:resolve: { username: 'foo'}
Sandro Munda

4

คุณสามารถสร้าง funciton ควบคุมและส่งผ่านพารามิเตอร์ของคุณด้วยวัตถุ $ ขอบเขต

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