Хакинг BPMonline:Проблема рендеринга контрола в BPMonline
Коллеги, есть важное решение одного вопроса по поводу BPMonline. Как известно, BPMonline – это не десктоп , и один из ярких примеров – это разница между объектом на сервере и его клиентским отображением в браузере. Наши UI-контролы могут быть неотрисованы (неотрендерены) на клиенте, что означает, что к контролу нельзя обращаться со стороны клиента во многих случаях, например, нельзя обращаться к его свойствам, так как они могут быть undefined, а также не все методы можно вызывать, так как тоже может быть работа с undefined логикой. Поэтому правильнее работать с контролом, когда он уже отрисован. Если вы добавляете клиентский скрипт (Page.AddScript) на PageLoadComplete, то на этот момент контрол может уже быть на странице, либо ещё нет, и имеем два кейса. Поэтому для добавления своей логики, её нужно обернуть таким кодом
else {{
Edit.on('rendercomplete',function(event) {{ /*Ваша логика работы с контролом*/ }}, Edit);
}}";
, где Edit – это Page.Edit.ClientID вашего контрола
Конкретно , такая ситуация обязательна,если ваша логика – функция при событии нажатия на клавишу (но я думаю, что и любое событие), тогда лучше делать это так (на одном примере):
}};
if ({0}.rendered) {{ {0}.el.on(Ext.isIE || Ext.isSafari3 ? 'keydown' : 'keypress', {0}KeyPressFunction , {0}); }}
else {{
{0}.on('rendercomplete',function(event) {{ {0}.el.on(Ext.isIE || Ext.isSafari3 ? 'keydown' : 'keypress', {0}KeyPressFunction , {0}) }}, {0});
}}";
Page.AddScript(string.Format(script,Page.SymptomsMemoEdit.ClientID));
Обращаю внимание, что для keypress нужно подписываться на el, а не на сам элемент
Список возможных ивентов (первый аргумент в методе “on”) доступен по свойству events у контрола (или элемента el)
В Chrome в консоли разработчика или в watch это можно посмотреть.