Используя Angular Material, можно ли закрыть определенный диалог

У меня есть приложение AngularJS, использующее фреймворк пользовательского интерфейса Angular Material.

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

То, что я могу найти в документации и коде, не согласуется (хотя код должен выиграть аргумент):

  • В документации говорится, что можно закрыть только последнюю версию с необязательный ответ
  • Код говорит, что последний, ряд последних или все открытые могут быть закрыты, с необязательным указанием причины
  • Пример в документация говорит, что определенный диалог может быть закрыт, с флагом, обозначающим, как и почему

Я сделал демонстрацию своих намерений, как MCV - вот основные моменты:

var dialog = {},
    promise = {};

function showDialogs(sourceEvent) {
    showDialog(sourceEvent, "one");
    showDialog(sourceEvent, "two");
}

function showDialog(sourceEvent, id) {
    dialog[id] = $mdDialog.alert({...});

    promise[id] = $mdDialog.show(dialog[id]);
    promise[id].finally(function() {
        dialog[id] = undefined;
    });
}

function closeDialogs() {
    $mdDialog.hide("Closed all for a reason", {closeAll: true});
}

function closeDialogLatest() {
    $mdDialog.hide("Closed from the outside");
}

function closeDialogReason() {
    $mdDialog.hide("Closed with a reason");
}

function closeDialogSpecific(id) {
    $mdDialog.hide(dialog[id], "finished");
}

EDIT:
Я знаю, что код всегда побеждает в споре о том, что происходит, но я не был полностью уверен, что это правильный код, на который я смотрел.
Я обновил примеры до лучше проверить и проиллюстрировать мою точку зрения и проблему. Это показывает, что все работает, как сказано в коде.

Что я действительно ищу, так это возможно ли достичь моей цели каким-то другим способом, о котором я еще не думал.


person Flygenring    schedule 02.09.2016    source источник
comment
Вероятно, документация просто неправильная или слишком старая. Документация может говорить все, что хотят авторы. Если в коде сказано, что это невозможно, то это на самом деле невозможно. Мне жаль.   -  person RicoBrassers    schedule 02.09.2016
comment
Я знаю, что важен код, но я не был полностью уверен, что это правильный код, на который я смотрел. Тем не менее, пример, который я сделал, показал, что все работает, как сказано в коде, но все еще может быть возможно достичь моей цели каким-то другим способом, о котором я еще не думал.   -  person Flygenring    schedule 02.09.2016


Ответы (2)


Использование $mdPanel вместо $mdDialog Мне удалось добиться желаемого эффекта; Я разветвил свою демонстрацию, чтобы отразить изменения — вот основные моменты:

var dialog = {};

function showDialogs() {
    showDialog("one");
    showDialog("two");
}

function showDialog(id) {
    var config = {...};

    $mdPanel.open(config)
        .then(function(panelRef) {
            dialog[id] = panelRef;
        });
}

function closeDialogs() {
    var id;

    for(id in dialog) {
        closeDialogSpecific(id, "Closed all for a reason");
    }
}

function closeDialogSpecific(id, reason) {
    var message = reason || "finished: " + id;

    if(!dialog.hasOwnProperty(id) || !angular.isObject(dialog[id])) {
        return;
    }

    if(dialog[id] && dialog[id].close) {
        dialog[id].close()
            .then(function() {
                vm.feedback = message;
            });
        dialog[id] = undefined;
    }
}
person Flygenring    schedule 30.09.2016

Я бы посоветовал иметь два или более диалоговых окна одновременно не идеально и, вероятно, не рекомендуется Google Material design.

Цитата из документов

Используйте диалоги экономно, потому что они мешают.

Ты говоришь:

когда запрос AJAX завершает выборку данных, я хотел бы, чтобы мой счетчик загрузки закрылся, но не диалоговое окно с ошибкой, которое может быть результатом выборки.

Мое решение здесь состояло бы в том, чтобы иметь один диалог, который изначально показывает счетчик. После завершения запроса замените счетчик любыми сообщениями.

person camden_kid    schedule 02.09.2016
comment
Я согласен, что диалогов не должно быть слишком много, и они встроены в структуру, так что в определенной степени это нормально. Причина, по которой я это делаю, заключается в том, чтобы информировать пользователей об ошибках, которые прерывают их работу и (как специально запрошено) блокируют все взаимодействия при загрузке данных (т. Е. Сохранении длинных форм), чтобы пользователь знал, что что-то происходит, но не может напортачить . - person Flygenring; 02.09.2016
comment
@Flygenring Вы уверены, что не можете сделать все это с помощью одного диалога? :-) - person camden_kid; 02.09.2016
comment
Я мог бы это сделать, но это потребовало бы реструктуризации всей системы, так как обработка ошибок (включая диалоги) осуществляется централизованно путем подключения к встроенной обработке исключений, а загрузка применяется непосредственно к определенным действиям. Но предложения заслуживают внимания! :-) - person Flygenring; 02.09.2016
comment
Независимо от того, является ли это оптимальным или предпочтительным решением моей проблемы, я нашел способ сделать это, используя материальную структуру предполагаемым образом, что продемонстрировано моим ответом :-) - person Flygenring; 30.09.2016
comment
Я разрабатываю приложение в реальном времени с подключением к веб-сокету, которое теряет соединение, когда вы теряете Wi-Fi или отключаете кабель Ethernet. В этом случае я хочу показать неотключаемый диалог наложения с фоном, говорящим «Отключено». Попытка переподключиться..., потому что пользовательский интерфейс не будет интерактивным без подключения. Возможно, я уже показываю какой-то другой диалог, когда это происходит, и я не хочу, чтобы он был закрыт, потому что я хочу, чтобы пользователь мог возобновить свою работу, когда соединение вернется. Это хороший пример, когда вам может понадобиться поддерживать несколько диалогов одновременно. - person Sammi; 14.01.2019