Вызов окна MODx.Window на ExtJs
Решил разобраться, почему криво работает вызов окна MODx.Window при разработке в админке, используя modExtra. Проблема в следующем — при первом вызове окно открывается в нормальном виде

При последующих вызовах получаю такое окно

Честно говоря, я не понимаю, почему происходит такая фигня.
Вот пример вызова окна в modExtra, который я использую
А пока копался, обнаружил, что такой код вызывает распухание DOMa — метод hide() скрывает окно (выставляет visibility: hidden). И при повторном вызове ExtJs создает новое окно (про старое-то он не знает). И вот так закрывая-открывая окно, получаем куча скрытых окошек в DOMе плюс разные служебные элементы ExtJS. Решая эту проблему, я попутно решил и описанную выше с кривыми окошками.
Измененный код
Теперь всегда используется уже созданное окно, а не создается новое. Обе проблема решены, но я все равно не понимаю, почему, например, у Tickets окна вызываются нормально, у меня нет, хотя в точности всё до запятой совпадает. Видимо есть какая-то мелкая мелочь, которая ускользнула от моего пристального внимания.

При последующих вызовах получаю такое окно

Честно говоря, я не понимаю, почему происходит такая фигня.
Вот пример вызова окна в modExtra, который я использую
createItem: function (btn, e) {
var w = MODx.load({
xtype: 'modextra-item-window-create',
id: Ext.id(),
listeners: {
success: {
fn: function () {
this.refresh();
}, scope: this
}
}
});
w.reset();
w.setValues({active: true});
w.show(e.target);
},В исходниках MODX используется такой же код. Также работает и Tickets. А у меня не хочет работать и все тут. До сегодняшнего дня поступал просто — закрывал окно методом close(), который уничтожает окно (стандартно вызывается hide(), скрывающий окно). Но тут возникает неприятный момент — при закрытии через close() не работает анимация (через hide(), окно как бы растворяется). Поэтому решил найти причину, чтобы красиво закрывать окно. А пока копался, обнаружил, что такой код вызывает распухание DOMa — метод hide() скрывает окно (выставляет visibility: hidden). И при повторном вызове ExtJs создает новое окно (про старое-то он не знает). И вот так закрывая-открывая окно, получаем куча скрытых окошек в DOMе плюс разные служебные элементы ExtJS. Решая эту проблему, я попутно решил и описанную выше с кривыми окошками.
Измененный код
if (!this.createWindow) {
this.createWindow= MODx.load({
xtype: 'dmodextra-item-window-create',
id: Ext.id(),
listeners: {
success: {
fn: function () {
this.refresh();
}, scope: this
}
}
});
}
this.createWindow.reset();
this.createWindow.setValues({active: true});
this.createWindow.show(e.target);Теперь всегда используется уже созданное окно, а не создается новое. Обе проблема решены
Комментарии: 24
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Такое дублирование элементов в ExtJS всегда бывает, если у них одинаковые id. Если у полей твоей формы указаны id и они не нужны тебе, на самом деле, то убирай их нафиг — пусть ExtJS сгенерирует уникальные автоматически.
У полей в окошке комментария, как видно, нигде id не указаны, поэтому их можно открыть сколько угодно и никаких дубликатов.
Теперь работает. Спасибо.
Но проблема с утечкой (хоть и не большой) в modExtra остается. Есть смысл в репозиторий modExtra писать?
Если есть желание, я могу тебя добавить в этот репозиторий, будешь сам принимать коммиты. Идёт?
Кстати, там же Илья вроде уже дирижирует.
А Илья просто коммитил, как и все.
Для старта должно хватить, а больше ничего на эту тему писать не планирую.
Ну вот захотелось мне открыть 100500 комментов — почему нет?
Не вижу проблемы, серьёзно. Если бы оперативка заканчивалась и браузер вешался — это утечка. А так просто не идеально =)
Я вот штук 30 окон наоткрывал, да так и не увидел разницы с потреблении оперативки браузером.
Дай хоть ссылку почитать, а то утечка не пойми чего происходит, а я и не в курсе.
Про утечки можно почитать на learn.javascript.ru.
Утечки памяти — это более тонкая материя. А то, что описали вы, формально — это просто баг (или фича) в _логике_ самого приложения.
Я привел Василию ссылку, где пишут про утечки. Там тоже пишут, что проблемы могут возникнуть, если интерфейс очень сложный. А в обычной жизни ни замыкания, ни jQuery утечки проблем не доставляют.
П.С. Я думаю, это не баг и не фича. Это способ программирования. Кто-то считает, что так можно и вреда не будет, кто-то нет. Вот и вся разница. Такой код не приведет к проблемам, иначе уже давно ругались бы при редактировании системных настроек.
П.П.С. Мы же вроде на ты уже общались :)
В новых виджетах я прибиваю окошки принудительно, сразу после скрытия, примерно так:
И анимация на месте, и лишних элементов не остаётся. Может и в Tickets когда-то это допишу, но не сегодня.
Подскажи, если знаешь, как оставить анимацию закрытия у окна, которому сам прописываю только одну кнопку закрытия, вместо стандартных
Кнопка закрывает окно без анимации. Посмотрел в исходниках MODx.Window. Там прописаны 2 кнопки — <Отмена> и <Сохранить>. Причем у кнопки отмены прописан тот же this.hide(). Но анимация работает. А у меня нет.
Решилась она верным открытием, а не свойствами самого окна:
Весь фокус в последней строке, точнее в Ext.EventObject.target. Попробуй.
Вот само окно, если что.
Решал это тем, что в методе открытия окна делал проверку на существование этого же окна в dom'е. Если в dom'е оно есть, то делаем hide(), remove(), а потом создаем окошко заново.
У окна, соответственно, жестко прописанный id-шник.
Как-то так: