Закройте диалог Dojo, нажав за его пределами - PullRequest
3 голосов
/ 10 февраля 2012

Я использую Dojo 1.6.1 и хочу сделать так, чтобы мои диалоги Dojo можно было закрыть, щелкнув за пределами самого диалога.После исследования, похоже, что один из самых простых способов сделать это - сделать что-то вроде этого:

var dij = dijit._underlay.domNode;
dojo.connect(dij, "onclick", function(e) { 
    dojo.query('[role="dialog"]').forEach(function(element) {
        if (element.className.match("dijit")) {
            if(element.id)
            {
                var widget = dijit.byId(element.id);
                if(widget._isShown() === true)
                {
                    widget.hide();  
                }
            }
        }
    });
});

Однако, это не работает, потому что возвращается dijit._underlay, говоря, что он не определен.Чего мне не хватает, чтобы выполнить это или есть еще более простой способ сделать это?

ОБНОВЛЕНИЕ Я обновил код, который работает, но он работает только после того, как я вызвал .show onодин из моих диалогов, потом послесловия это все соус.Похоже, подложка не создается до тех пор, пока не появится хотя бы одно диалоговое окно.

Ответы [ 2 ]

5 голосов
/ 10 февраля 2012

Я чувствую себя глупо, быстро это выясняя. Уловка в том, что dijit._underlay не инициализируется, пока вы не вызовете диалог .show () в первый раз После этого он будет повторно использовать dijit._underlay. Тем не менее, вы можете сделать этот же трюк прямо перед собой. Итак, я проверяю, существует ли dijit._underlay или нет. Однако, если он не создан, я делаю это, и все диалоги будут работать на этом. Итак, вот рабочий код:

var dij = null;
if(dijit._underlay === undefined)
{
    dijit._underlay = new dijit.DialogUnderlay();
}
dij = dijit._underlay.domNode;
dojo.connect(dij, "onclick", function(e) { 
    dojo.query('[role="dialog"]').forEach(function(element) {
        if (element.className.match("dijit")) {
            if(element.id)
            {
                var widget = dijit.byId(element.id);
                if(widget._isShown() === true)
                {
                    widget.hide();  
                }
            }
        }
    });
});
1 голос
/ 10 февраля 2012

Если вы можете открыть несколько диалогов, это означает, что они вложены и вызваны друг другом.Но есть только одна подложка, которая перемещается (zIndex) каждый раз, когда открывается новый диалог.Было бы неплохо использовать виджет типа контроллера для «хранения» каждого экземпляра диалога.Как свойство dialogList, в котором вы будете выдвигать новые диалоги.И затем, нажав на подкладку, вы скрываете диалоги, начиная с последнего в списке.Я думаю, что «порядок» важен, когда вы пытаетесь скрыть их, как вы.Надеюсь, это поможет:)

...