Hiển thị cửa sổ bật lên một cách thanh lịch nhất


178

Tôi có ứng dụng AngularJS này. Tất cả mọi thứ hoạt động tốt.

Bây giờ tôi cần hiển thị các cửa sổ bật lên khác nhau khi điều kiện cụ thể trở thành sự thật và tôi đã tự hỏi điều gì sẽ là cách tốt nhất để tiến hành.

Hiện tại tôi đang đánh giá hai tùy chọn, nhưng tôi hoàn toàn mở cho các tùy chọn khác.


lựa chọn 1

Tôi có thể tạo phần tử HTML mới cho cửa sổ bật lên và thêm vào DOM trực tiếp từ bộ điều khiển.

Điều này sẽ phá vỡ mẫu thiết kế MVC. Tôi không hài lòng với giải pháp này.


Lựa chọn 2

Tôi luôn có thể chèn mã cho tất cả các cửa sổ bật lên trong tệp HTML tĩnh. Sau đó, bằng cách sử dụng ngShow, tôi chỉ có thể ẩn / hiển thị đúng cửa sổ bật lên.

Tùy chọn này không thực sự có khả năng mở rộng.


Vì vậy, tôi khá chắc chắn rằng phải có một cách tốt hơn để đạt được những gì tôi muốn.


Nhiều cách, bộ điều khiển cho html chắc chắn không phải là cách hay, hãy xem UI Bootstrap Modal angular-ui.github.com/bootstrap/#/modal
charlietfl

1
Các tài liệu của AngularJS giải thích một chút về cách quản lý cửa sổ bật lên, trong phần ' Hiểu về Loại trừ và Phạm vi '. Hi vọng điêu nay co ich.
Biệt thự Ivan Ferrer

Nếu bạn thực sự muốn mở rộng quy mô với cửa sổ bật lên thì hãy xem popscript .
Raj Nathani

Câu trả lời:


88

Dựa trên kinh nghiệm của tôi với các phương thức AngularJS cho đến nay tôi tin rằng cách tiếp cận thanh lịch nhất là một dịch vụ dành riêng mà chúng tôi có thể cung cấp một mẫu (HTML) được hiển thị theo phương thức.

Khi chúng tôi nghĩ về nó, các phương thức là loại tuyến AngularJS nhưng chỉ hiển thị trong cửa sổ bật lên phương thức.

Dự án bootstrap AngularUI ( http://angular-ui.github.com/bootstrap/ ) có một $modaldịch vụ tuyệt vời (được gọi là hộp thoại $ trước phiên bản 0.6.0) là triển khai dịch vụ để hiển thị nội dung một phần như một cửa sổ bật lên phương thức.


10
Hộp thoại $ bây giờ là $ modal
Sangram Singh

1
@ pkozlowski.opensource Tôi thích cách tiếp cận của ui-bootstrap tuy nhiên tôi dường như không thể chuyển nội dung với phương thức. Tôi đã nghiên cứu một số và thấy những người khác cũng có vấn đề này.
jusopi

2
weblogs.asp.net/dwahlin/building-an-angularjs-modal-service Tôi thấy điều này rất hữu ích.
JenonD

Chỉ cần đề cập, một dịch vụ không nên truy cập DOM. Một chỉ thị là nơi cho việc này.
siêu sáng

1
@superluminary đây thực sự là một quy tắc chung tốt để tuân theo, nhưng cũng có thể biết tại sao một quy tắc nhất định được tiến hành và hiểu khi nào một quy tắc như vậy có thể (hoặc thậm chí nên!) bị phá vỡ. Tôi tin rằng phương thức / chú giải công cụ và những thứ tương tự là ngoại lệ của quy tắc. Tóm lại: người ta cần biết các quy tắc nhưng cũng hiểu bối cảnh nơi những người áp dụng / không áp dụng.
pkozlowski.opensource

29

Thật buồn cười vì tôi đang tự học Angular và đang xem một số video từ kênh của họ trên Youtube. Diễn giả đề cập đến vấn đề chính xác của bạn trong video này https://www.youtube.com/watch?v=ZhfUv0spHCY#t=1681 vào khoảng 28:30 phút.

Nó đặt xuống để đặt đoạn mã cụ thể đó vào một dịch vụ thay vì bộ điều khiển.

Tôi đoán sẽ tiêm các phần tử bật lên mới vào DOM và xử lý chúng riêng rẽ thay vì hiển thị và ẩn phần tử tương tự. Bằng cách này bạn có thể có nhiều cửa sổ bật lên.

Toàn bộ video cũng rất thú vị để xem :-)


2
Misko là hạt giống của góc cạnh! (bwa haha). Nghiêm túc tho. Coi lời nói của ông như các nguồn đáng tin cậy cho góc.
boong

14
  • Tạo một lệnh 'cửa sổ bật lên' và áp dụng nó vào vùng chứa nội dung cửa sổ bật lên
  • Trong chỉ thị, bọc nội dung ở vị trí div tuyệt đối cùng với div mặt nạ bên dưới nó.
  • Bạn có thể di chuyển 2 div trong cây DOM khi cần trong lệnh. Bất kỳ mã UI nào cũng được chấp nhận trong các chỉ thị, bao gồm cả mã để định vị cửa sổ bật lên ở giữa màn hình.
  • Tạo và liên kết một cờ boolean để điều khiển. Cờ này sẽ kiểm soát tầm nhìn.
  • Tạo các biến phạm vi liên kết với các hàm OK / Hủy, v.v.

Chỉnh sửa để thêm một ví dụ cấp cao (không chức năng)

<div id='popup1-content' popup='showPopup1'>
  ....
  ....
</div>


<div id='popup2-content' popup='showPopup2'>
  ....
  ....
</div>



.directive('popup', function() {
  var p = {
      link : function(scope, iElement, iAttrs){
           //code to wrap the div (iElement) with a abs pos div (parentDiv)
          // code to add a mask layer div behind 
          // if the parent is already there, then skip adding it again.
         //use jquery ui to make it dragable etc.
          scope.watch(showPopup, function(newVal, oldVal){
               if(newVal === true){
                   $(parentDiv).show();
                 } 
              else{
                 $(parentDiv).hide();
                }
          });
      }


   }
  return p;
});

$ xem thay vì 'xem'. cũng không phải là 'cửa sổ bật lên' thay vì 'showPopup' trong scope.watch(showPopup, function(newVal, oldVal){?
Sangram Singh

14

Xem http://adamalbrecht.com/2013/12/12/creating-a-simple-modal-dialog-directive-in-angular-js/ để biết cách đơn giản thực hiện hộp thoại phương thức với Angular và không cần bootstrap

Chỉnh sửa: Tôi đã sử dụng hộp thoại ng từ http://likeastore.github.io/ngDialog , tính linh hoạt và không có bất kỳ phụ thuộc nào.


1
Tôi vừa mới chạy nước rút nhanh với cách tiếp cận này chỉ để nhận ra rằng điều này rất tốt cho một cách tiếp cận cửa sổ bật lên / phương thức duy nhất, tuy nhiên hãy nghĩ về UX cụ thể này: Giả sử một khách hàng đang đặt hàng và UI trình bày một cửa sổ bật lên xác nhận (vì vậy chúng tôi Cửa sổ bật lên của Adam có nội dung). Bây giờ chúng tôi nhấp vào gửi hoặc mua hoặc bất cứ thứ gì từ cửa sổ bật lên đó và có lỗi mà người dùng cần sửa đổi thứ tự đó trong màn hình trước đó. Tôi muốn hiển thị lỗi đó trong một cửa sổ bật lên khác ở cấp cao nhất. Cách tiếp cận này không tạo điều kiện cho điều này tôi không tin.
jusopi

3
Đúng nhưng tôi nghĩ nhiều hơn một cửa sổ bật lên có thể là một giao diện người dùng kém.
Nik Dow

Vâng, plugin là câu trả lời tôi đang tìm kiếm!
Andres Felipe

7

Angular-ui đi kèm với chỉ thị hộp thoại. Sử dụng nó và đặt templateurl vào bất kỳ trang nào bạn muốn đưa vào. Đó là cách thanh lịch nhất và tôi cũng đã sử dụng nó trong dự án của mình. Bạn có thể truyền một số tham số khác cho hộp thoại theo nhu cầu.


5
angular-bootstrap 0.6 trở đi đã thay thế hộp thoại $ bằng $ modal. Điều đó có nghĩa là bạn cần thay đổi tất cả mã đang sử dụng hộp thoại $ vì nó không được dùng nữa và viết nó bằng $ modal
Mohammad Umair Khan
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.