Диалоговые окна никогда не вызывали у меня интереса к моим предыдущим ограниченным сторонним проектам веб-разработки, тот факт, что я никогда не видел их использования, является одной из причин, и всегда есть надежный вызов Alert, который выполняет ту работу, которую я требую. Модальные блоки Bootstrap интересны, но у них не было времени, чтобы по-настоящему в них погрузиться. Затем появился шанс изучить Angular.

Я играю с Angular и Angular Material почти 2 месяца. Буквально в прошлом месяце они буквально сломали меня, взломав некоторые из моих кодов с его последней версией. Не начинай упоминать о флексе, я не могу осмыслить это. Но в этой структуре есть то, что вы любите и ненавидите. Во-первых, легко понять реализацию диалоговых окон Angular Material.

У меня были годы работы, полагаясь на окна сообщений Windows для оповещения обо всем. Простой звонок и легкий результат. Вот код C # для отображения окна сообщения.

string message = "Do you want to abort this operation?";
string title = "Close Window";
MessageBoxButtons buttons = MessageBoxButtons.AbortRetryIgnore;
 
DialogResult result = MessageBox.Show(message, title, buttons,
                        MessageBoxIcon.Warning);

О, я скучаю по WinForms, но все должно продолжаться. Итак, я попытался имитировать стиль вызова в Angular, чтобы отобразить настраиваемое поле оповещения. Вот мой пример вызова для отображения окна предупреждения.

MessageBox.show(this.dialog, this.message, this.title,        
                this.information, this.button,
                this.allow_outside_click, this.style,
                this.width)
    .subscribe( result => {
        console.log(result);
    });

MessageBox.show(this.dialog, `The result is : ${response}`);
MessageBox.show(this.dialog, `Hello, World!`);

Вот моя реализация. Возможно, это не самый элегантный или самый эффективный подход, но он дает мне то, что мне нужно. Кстати, исходный код доступен на GitHub



Компонент

Я создал один компонент для пользовательского интерфейса MessageBox. Он имеет два доступных стиля: полный и простой. Элементы пользовательского интерфейса показаны ниже.

Варианты конфигурации:

  • Заголовок - отображаемый текст в строке заголовка диалогового окна. По умолчанию используется значение «Alert», если не указано иное. Строка заголовка отображается, только если для стиля установлено значение «Полный».
  • Сообщение - основное сообщение, которое будет показано пользователю.
  • Информация - необязательная дополнительная информация для отображения.
  • Кнопки - типы отображаемых кнопок. В настоящее время поддерживается только следующее: OK, OK / CANCEL, YES / NO, ACCEPT / REJECT.
  • Разрешить щелчок снаружи для закрытия - разрешить пользователям просто щелкать любую область на экране за пределами диалогового окна, чтобы закрыть его. По умолчанию пользователям необходимо нажимать кнопки, чтобы начать закрытие.
  • Стиль - определяет стиль диалогового окна. Он поддерживает два стиля: полный и простой.
  • Ширина - ширина диалогового окна.

Компонент DialogBox не имеет сложной логики. Он предназначен для отображения сообщения и возврата ответа пользователя. Когда пользователь нажимает кнопку, закройте пользовательский интерфейс и верните результат.

onOk() {
  this.dialogRef.close({result: "ok"});
}
onCancel() {
  this.dialogRef.close({result: "cancel"});
}

Статический класс MessageBox

Я использовал статический класс для имитации вызова C #. Сервис, должно быть, был лучшей реализацией, но я выбрал более простой. Единственная проблема, с которой я столкнулся с этим подходом, заключается в том, что статический класс не может использовать преимущества внедрения зависимостей, поэтому вы заметите, что я должен передать объект MatDialog в качестве параметра.

export class MessageBox {
  static show(dialog: MatDialog, message, title = "Alert",                    
              information = "", button = 0, 
              allow_outside_click = false, 
              style = 0, width = "200px") {
    const dialogRef = dialog.open( SimpleDialogComponent, {        
          data: {
                  title: title || "Alert",
                  message: message,
                  information: information,
                  button: button || 0,
                  style: style || 0,
                  allow_outside_click: allow_outside_click || false
          },
          width: width
    });    
    return dialogRef.afterClosed();     
  }
}

Обратите внимание, что ответ возвращается как Observable. Потребитель этого класса должен подписаться, чтобы получить фактический ответ.

Служба сообщений

В некоторых случаях моему приложению требуется служба сообщений для запуска моего диалогового окна. Обычно это используется для отображения сообщения в результате завершения процесса из другой службы. Вот простой сервис сообщений для выполнения этой работы.

@Injectable()
export class MessageService {
  private message = new Subject<any>();
  constructor() { }
  // the type can be used in case you want to classify the alert
  sendMessage(message: string, type = 1) { 
     this.message.next({text: message, type: type});
  }
  getMessage(): Observable<any> {
    return this.message.asObservable();
  }
  clearMessage() {
    this.message.next();
  }
}

Как использовать MessageBox

Мы можем просто вызвать метод MessageBox.show () прямо в вашем коде.

MessageBox.show(this.dialog, this.message, this.title,        
                this.information, this.button,
                this.allow_outside_click, this.style,
                this.width)
    .subscribe( result => {
        console.log(result);
    });

Или, если вы хотите использовать службу сообщений.

onSendService() {
  this.messageService.sendMessage(this.message);
}

Просто убедитесь, что вы подписались на услугу.

this.subscriber = this.messageService.getMessage()
  .subscribe(message => {
    MessageBox.show(this.dialog, message.text);
});

Если у вас есть комментарии или предложения по поводу решения, не стесняйтесь нажимать поле для комментариев. Удачного кодирования!

Это сообщение было обновлено 11 декабря 2017 г. и добавлена ​​реализация службы сообщений.

Эта статья также размещена в моем личном блоге.

Если этот пост в любом случае вам помог, нажмите кнопку хлопка 👏 несколько раз ниже, чтобы выразить свою поддержку!