ฉันจะเพิ่มความกว้างของโมดอลใน Angular UI Bootstrap ได้อย่างไร


109

ฉันกำลังสร้างโมดอล:

var modal = $modal.open({
                    templateUrl: "/partials/welcome",
                    controller: "welcomeCtrl",
                    backdrop: "static",
                    scope: $scope,
                });

มีวิธีเพิ่มความกว้างไหม



1
คุณสามารถเปลี่ยนความกว้างได้ตลอดเวลาโดยใช้ css
Alex Choroshin

คำตอบ:


224

ฉันใช้คลาส css เพื่อกำหนดเป้าหมายคลาส modal-dialog:

.app-modal-window .modal-dialog {
  width: 500px;
}

จากนั้นในคอนโทรลเลอร์ที่เรียกหน้าต่างโมดอลให้ตั้งค่า windowClass:

    $scope.modalButtonClick = function () {
        var modalInstance = $modal.open({
            templateUrl: 'App/Views/modalView.html',
            controller: 'modalController',
            windowClass: 'app-modal-window'
        });
        modalInstance.result.then(
            //close
            function (result) {
                var a = result;
            },
            //dismiss
            function (result) {
                var a = result;
            });
    };

6
ยอดเยี่ยมมากฉันไม่รู้ว่ามันต้องใช้กับ.modal-dialog
Jaanus

ควรใช้ Css ทั้ง. app-modal-window และ. modal-dialog ดังนั้น: .app-modal-window, .modal-dialog {width: 500px; }
Alexander

2
@ Alexander ไม่ได้เป็นไปตามการทดสอบของฉันเพิ่มความกว้างให้กับองค์ประกอบหลักของสกรูโมดอลไดอะล็อกมันขึ้นทั้งหมด
Rob J

@RobJacobs ขออภัยฉันไม่ได้พูดถึงฉันใช้ boostrap 2.3.2 ฉันเดาว่านี่เป็นเหตุผลที่ฉันควรตั้งค่าความกว้างสำหรับทั้ง. app-modal-window และ. modal-dialog
Alexander

1
@ZeroDistraction windowClass ที่กำหนดไว้จะถูกเพิ่มไปยังแอตทริบิวต์คลาสองค์ประกอบในฟังก์ชัน modalWindow directive - link ซึ่งอยู่หลังเฟสคอมไพล์ดังนั้นคำสั่ง 'C' จะไม่ถูกคอมไพล์
Rob J

48

อีกวิธีง่ายๆคือใช้ 2 ขนาดที่สร้างไว้ล่วงหน้าและส่งเป็นพารามิเตอร์เมื่อเรียกใช้ฟังก์ชันใน html ของคุณ ใช้: 'lg' สำหรับโมดอลขนาดใหญ่ที่มีความกว้าง 900px 'sm' สำหรับโมดอลขนาดเล็กที่มีความกว้าง 300px หรือไม่ส่งพารามิเตอร์ใด ๆ ที่คุณใช้ขนาดเริ่มต้นซึ่งเป็น 600px

โค้ดตัวอย่าง:

$scope.openModal = function (size) {
var modal = $modal.open({
                templateUrl: "/partials/welcome",
                controller: "welcomeCtrl",
                backdrop: "static",
                scope: $scope,
                size: size,
            });
modal.result.then(
        //close
        function (result) {
            var a = result;
        },
        //dismiss
        function (result) {
            var a = result;
        });
};

และใน html ฉันจะใช้สิ่งต่อไปนี้:

<button ng-click="openModal('lg')">open Modal</button>  

3
ฉันพบว่าในกรณีส่วนใหญ่ขนาดสำเร็จรูปคือทั้งหมดที่ฉันต้องการ +1 เพื่อไม่ต้องดำเนินการ css ที่กำหนดเอง!
Kilhoffer

1
ใช้งานได้เหมือนมีเสน่ห์ ขอบคุณสำหรับการชี้แจงขนาด css ในตัวที่มีอยู่
คิงส์

28

คุณสามารถระบุความกว้างที่กำหนดเองสำหรับคลาส. modal-lg โดยเฉพาะสำหรับป๊อปอัปของคุณเพื่อความละเอียดของวิวพอร์ตที่กว้างขึ้น นี่คือวิธีการ:

CSS:

@media (min-width: 1400px){

   .my-modal-popup .modal-lg {
       width: 1308px;
   }       

}

JS:

var modal = $modal.open({
    animation: true,
    templateUrl: 'modalTemplate.html',
    controller: 'modalController',
    size: 'lg',
    windowClass: 'my-modal-popup'
});

1
วิธีแก้ปัญหานั้นดี แต่ไวยากรณ์ CSS ไม่ถูกต้องสำหรับฉัน ผมต้องปรับ css
Jianwu Chen

12

เมื่อเราเปิด modal จะยอมรับขนาดเป็น paramenter:

ค่าที่เป็นไปได้สำหรับขนาด: sm, md, lg

$scope.openModal = function (size) {
var modal = $modal.open({
      size: size,
      templateUrl: "/app/user/welcome.html",
      ...... 
      });
}

HTML:

<button type="button" 
    class="btn btn-default" 
    ng-click="openModal('sm')">Small Modal</button>

<button type="button" 
    class="btn btn-default" 
    ng-click="openModal('md')">Medium Modal</button>

<button type="button" 
    class="btn btn-default" 
    ng-click="openModal('lg')">Large Modal</button>

หากคุณต้องการขนาดที่เฉพาะเจาะจงให้เพิ่มสไตล์ในโมเดล HTML:

<style>.modal-dialog {width: 500px;} </style>

12

มีอีกวิธีหนึ่งที่คุณไม่จำเป็นต้องเขียนทับคลาส uibModal และใช้หากจำเป็น: คุณเรียกฟังก์ชัน $ uibModal.open ด้วยประเภทขนาดของคุณเองเช่น "xlg" จากนั้นคุณกำหนดคลาสชื่อ "modal-xlg" ตามด้านล่าง :

.modal-xlg{
   width:1200px;
}

เรียก $ uibModal.open เป็น:

 var modalInstance = $uibModal.open({
                ...  
                size: "xlg",
            });

และจะได้ผล เพราะสตริงใดก็ตามที่คุณส่งผ่านเป็นขนาด bootstrap จะรวมเข้ากับ "modal-" และสิ่งนี้จะมีบทบาทเป็นคลาสสำหรับหน้าต่าง


3

ฉันพบว่ามันง่ายกว่าที่จะยึดเทมเพลตจาก Bootstrap-ui ฉันได้ปล่อยให้ HTML ที่แสดงความคิดเห็นยังคงอยู่เพื่อแสดงสิ่งที่ฉันเปลี่ยนแปลง

เขียนทับเทมเพลตเริ่มต้น:

<script type="text/ng-template" id="myDlgTemplateWrapper.html">
    <div tabindex="-1" role="dialog" class="modal fade" ng-class="{in: animate}" 
         ng-style="{'z-index': 1050 + index*10, display: 'block'}" ng-click="close($event)"> 
        <!-- <div class="modal-dialog"
            ng-class="{'modal-sm': size == 'sm', 'modal-lg': size == 'lg'}"
            >
            <div class="modal-content"  modal-transclude></div>
        </div>--> 

        <div modal-transclude>
            <!-- Your content goes here -->
        </div>
    </div>
</script>

แก้ไขเทมเพลตการโต้ตอบของคุณ (สังเกต DIV ของ Wrapper ที่มีคลาส "modal-dialog" และคลาส "modal-content"):

<script type="text/ng-template" id="myModalContent.html">
    <div class="modal-dialog {{extraDlgClass}}"
         style="width: {{width}}; max-width: {{maxWidth}}; min-width: {{minWidth}}; ">
        <div class="modal-content">
            <div class="modal-header bg-primary">
                <h3>I am a more flexible modal!</h3>
            </div>
            <div class="modal-body"
                 style="min-height: {{minHeight}}; height: {{height}}; max-height {{maxHeight}}; ">
                <p>Make me any size you want</p>
            </div>
            <div class="modal-footer">
                <button class="btn btn-primary" ng-click="ok()">OK</button>
                <button class="btn btn-warning" ng-click="cancel()">Cancel</button>
            </div>
        </div>
    </div>
</script>

จากนั้นเรียกโมดอลด้วยพารามิเตอร์คลาส CSS หรือสไตล์ที่คุณต้องการเปลี่ยนแปลง (สมมติว่าคุณได้กำหนด "แอป" ไว้ที่อื่นแล้ว):

<script type="text/javascript">
    app.controller("myTest", ["$scope", "$modal", function ($scope, $modal)
    {
        //  Adjust these with your parameters as needed

        $scope.extraDlgClass = undefined;

        $scope.width = "70%";
        $scope.height = "200px";
        $scope.maxWidth = undefined;
        $scope.maxHeight = undefined;
        $scope.minWidth = undefined;
        $scope.minHeight = undefined;

        $scope.open = function ()
        {
            $scope.modalInstance = $modal.open(
            {
                backdrop: 'static',
                keyboard: false,
                modalFade: true,

                templateUrl: "myModalContent.html",
                windowTemplateUrl: "myDlgTemplateWrapper.html",
                scope: $scope,
                //size: size,   - overwritten by the extraDlgClass below (use 'modal-lg' or 'modal-sm' if desired)

                extraDlgClass: $scope.extraDlgClass,

                width: $scope.width,
                height: $scope.height,
                maxWidth: $scope.maxWidth,
                maxHeight: $scope.maxHeight,
                minWidth: $scope.minWidth,
                minHeight: $scope.minHeight
            });

            $scope.modalInstance.result.then(function ()
            {
                console.log('Modal closed at: ' + new Date());
            },
            function ()
            {
                console.log('Modal dismissed at: ' + new Date());
            });
        };

        $scope.ok = function ($event)
        {
            if ($event)
                $event.preventDefault();
            $scope.modalInstance.close("OK");
        };

        $scope.cancel = function ($event)
        {
            if ($event)
                $event.preventDefault();
            $scope.modalInstance.dismiss('cancel');
        };

        $scope.openFlexModal = function ()
        {
            $scope.open();
        }

    }]);
</script>

เพิ่มปุ่ม "เปิด" แล้วยิงออกไป

    <button ng-controller="myTest" class="btn btn-default" type="button" ng-click="openFlexModal();">Open Flex Modal!</button>

ตอนนี้คุณสามารถเพิ่มคลาสพิเศษใดก็ได้ที่คุณต้องการหรือเพียงแค่เปลี่ยนขนาดความกว้าง / ความสูงตามความจำเป็น

ฉันใส่ไว้ในคำสั่ง wrapper เพิ่มเติมซึ่งควรจะเป็นเรื่องเล็กน้อยจากจุดนี้ไปข้างหน้า

ไชโย


3

ฉันแก้ไขปัญหาโดยใช้โซลูชัน Dmitry Komin แต่ด้วยไวยากรณ์ CSS ที่แตกต่างกันเพื่อให้ทำงานได้โดยตรงในเบราว์เซอร์

CSS

@media(min-width: 1400px){
    .my-modal > .modal-lg {
        width: 1308px;
    }
}

JS เหมือนกัน:

var modal = $modal.open({
    animation: true,
    templateUrl: 'modalTemplate.html',
    controller: 'modalController',
    size: 'lg',
    windowClass: 'my-modal'
});

3

คุณสามารถทำได้ง่ายๆโดยใช้คุณสมบัติขนาดของโมดอลเชิงมุม

var modal = $modal.open({
                    templateUrl: "/partials/welcome",
                    controller: "welcomeCtrl",
                    backdrop: "static",
                    scope: $scope,
                    size:'lg' // you can try different width like 'sm', 'md'
                });

1

หากคุณต้องการใช้ขนาดใหญ่เริ่มต้นคุณสามารถเพิ่ม 'modal-lg':

var modal = $modal.open({
          templateUrl: "/partials/welcome",
          controller: "welcomeCtrl",
          backdrop: "static",
          scope: $scope,
          windowClass: 'modal-lg'
});

0

ใช้ความกว้างสูงสุดในกล่องโต้ตอบโมดอลสำหรับเชิงมุม 5

.mod-class .modal-dialog {
    max-width: 1000px;
}

และใช้ windowClass ตามที่คนอื่นแนะนำ TS เช่น:

this.modalService.open(content, { windowClass: 'mod-class' }).result.then(
        (result) => {
            // this.closeResult = `Closed with: ${result}`;
         }, (reason) => {
            // this.closeResult = `Dismissed ${this.getDismissReason(reason)}`;
});

นอกจากนี้ฉันต้องใส่รหัส css ในสไตล์ส่วนกลาง> styles.css

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.