Покажіть спливаючі вікна найелегантнішим способом


178

У мене є ця програма AngularJS. Все працює просто чудово.

Тепер мені потрібно показувати різні спливаючі вікна, коли конкретні умови стануть справдими, і мені було цікаво, що було б найкращим способом продовжити.

В даний час я оцінюю два варіанти, але я абсолютно відкритий для інших варіантів.


Варіант 1

Я міг би створити новий елемент HTML для спливаючих вікон і додати до DOM безпосередньо від контролера.

Це порушить модель дизайну MVC. Я не задоволений цим рішенням.


Варіант 2

Я завжди міг вставити код для всіх спливаючих вікон у статичний HTML-файл. Тоді за допомогою ngShowя можу приховати / показати лише правильне спливаюче вікно.

Цей варіант насправді не масштабується.


Тож я впевнений, що має бути кращий спосіб досягти того, що я хочу.


численні способи, контролер для html, безумовно, не дуже добре, дивіться на UI Bootstrap Modal angular-ui.github.com/bootstrap/#/modal
charlietfl

1
Документи AngularJS дещо пояснюють, як керувати спливаючими вікнами , у розділі " Розуміння переключення та сфери застосування ". Сподіваюся, це допомагає.
Іван Феррер Вілла

Якщо ви дійсно хочете змінити масштаб із спливаючими вікнами, перевірте popscript .
Радж Натані

Відповіді:


88

Виходячи з мого досвіду роботи з модулями AngularJS, я вважаю, що найелегантніший підхід - це спеціалізована послуга, якій ми можемо надати частковий (HTML) шаблон для відображення в модальному режимі.

Коли ми думаємо про це, модали - це різновиди маршрутів AngularJS, але просто відображаються у модальному спливаючому вікні.

Проект завантажувальної програми AngularUI ( http://angular-ui.github.com/bootstrap/ ) має чудовий $modalсервіс (раніше його називали $ dialog до версії 0.6.0), що є реалізацією послуги, що відображає вміст часткової як модальне спливаюче вікно.


10
$ діалог тепер $ модальний
Sangram Singh

1
@ pkozlowski.opensource Мені подобається підхід ui-bootstrap, однак я не можу перетворити вміст у модуль. Я досліджував це деякі і бачу, що інші люди також мають це питання.
jusopi

2
weblogs.asp.net/dwahlin/building-an-angularjs-modal-service Я вважав це мистецтво дуже корисним.
JenonD

Відзначимо, сервіс не повинен мати доступ до DOM. Директива - це місце для цього.
суперлюмінація

1
@superluminary це дійсно добре загальне правило, якого слід дотримуватися, але також бог знати, чому певне правило йде в темпі, і розуміти, коли таке правило можна (або навіть слід!) порушити. Я вважаю, що модалі / підказки тощо є винятком із правила. Якщо коротко: потрібно знати правила, але також розуміти контекст, де вони застосовуються / не застосовуються.
pkozlowski.opensource

29

Це смішно, бо я сам навчаюсь Angular і дивився деякі відео з їх каналу на Youtube. Доповідач згадує вашу точну проблему у цьому відео https://www.youtube.com/watch?v=ZhfUv0spHCY#t=1681 близько 28:30 хвилин.

Це зводиться до розміщення цього конкретного фрагмента коду в сервісі, а не в контролері.

Думаю, було б вставити нові спливаючі елементи в DOM та обробити їх окремо, а не показувати та приховувати той самий елемент. Таким чином ви можете мати кілька спливаючих вікон.

Ціле відео дуже цікаво також дивитись :-)


2
Місько - кутовий насіння! (бва-ха-ха). Серйозно тхо. Ставтеся його слово як на основному джерелі для кутового.
палуба

14
  • Створіть директиву "спливаюче вікно" та застосуйте її до контейнера вмісту
  • У директиві загортайте вміст у абсолютне місце div разом із маскою div під ним.
  • Добре переміщувати 2 діви в дереві DOM за потребою зсередини директиви. Будь-який код користувальницького інтерфейсу відповідає нормам, включаючи код для розміщення спливаючого вікна в центрі екрана.
  • Створіть і прив’яжіть булевий прапор до контролера. Цей прапор буде контролювати видимість.
  • Створіть змінні області, які прив'язуються до функцій ОК / Скасувати тощо.

Редагування, щоб додати приклад високого рівня (нефункціональний)

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

$ watch замість 'watch'. також shd, чи не буде 'popup' замість 'showPopup' у scope.watch(showPopup, function(newVal, oldVal){?
Sangram Singh

14

Дивіться http://adamalbrecht.com/2013/12/12/creating-a-simple-modal-dialog-directive-in-angular-js/ для простого способу ведення модального діалогу з кутовим і без необхідності завантажувальної програми

Редагувати: з тих пір я використовую ng-діалог від http://likeastore.github.io/ngDialog, який є гнучким і не має ніяких залежностей.


1
Я просто зробив швидкий спринт з таким підходом, щоб зрозуміти, що це чудово для одного спливаючого / модального підходу, однак подумайте про цей конкретний UX: Скажіть, що клієнт замовляє товар, а інтерфейс подає спливаюче підтвердження замовлення (тому ми 'зайняв' спливаюче вікно Адама вмістом). Тепер ми натискаємо надіслати або купити або що-небудь із цього спливаючого вікна, і виникла помилка, у якій користувачеві потрібно змінити цей порядок у попередньому екрані. Я хочу відобразити цю помилку в іншому спливаючому віці на верхньому рівні. Цей підхід не сприяє цьому, я не вірю.
jusopi

3
Щоправда, але я думаю, що декілька спливаючих вікон можуть бути поганим інтерфейсом користувача.
Нік Дау

ну плагін - це відповідь, яку я шукав!
Андрес Феліпе

7

Angular-ui поставляється з діалоговою директивою. Використовуйте його та встановіть templateurl на будь-яку сторінку, яку ви хочете включити. Це найелегантніший спосіб, і я використав це також у своєму проекті. Ви можете передавати декілька інших параметрів для діалогу за потребою.


5
angular-bootstrap 0,6 і далі замінив діалог $ на $ модальний. Це означає, що вам потрібно змінити весь код, що використовує діалог $, оскільки він застарілий, і записати його в $ модально
Mohammad Umair Khan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.