Выполните действие после завершения метода render()

мне нужно сделать некоторые действия, когда render() метод завершил свою работу и добавил Все HTML-элементы в DOM. Как подписаться на onRenderEnds событие (такого события нет)? Могу ли я написать свое собственное событие вне кода slickgrid и прикрепить его к render() способ?


есть некоторые события "onScroll", "onViewportChanged" но они случались и раньше render() закончил (в некоторых случаях).


обновление: Я пишу форматер для столбца:

formatter: function(row, cell, value, columnDef, dataContext){
    return "<div class='operationList' data-my='" + myData + "'></div>";            
}

при визуализации сетки (применяя мой форматтер) мне нужно пройти через все ".operationList" divs и преобразовать их в другие конструкции (на основе ). Мне нужно заменить ".operationList" divs со сложной структурой с обработчиками событий.

2 ответов


основной ответ-нет ! То, что вы предлагаете, является очень плохим дизайном и противоречит основным принципам и архитектуре SlickGrid.

вы в конечном итоге делаете много избыточной работы и отрицаете большинство преимуществ производительности SlickGrid. Сетка будет создавать и удалять узлы DOM строк на лету при прокрутке и делать это синхронно или асинхронно в зависимости от того, какой из них подходит лучше всего в то время. Если вы должны иметь богатый интерактивный контент в ячейки, используйте пользовательские визуализаторы ячеек и делегируйте всю обработку событий на уровень сетки, используя предоставленные события, такие как onClick. Если содержимое ячейки абсолютно невозможно создать с помощью рендеринга, используйте async post-rendering -http://mleibman.github.com/SlickGrid/examples/example10-async-post-render.html. Тем не менее, содержимое сетки не должно иметь прослушивателей событий, зарегистрированных непосредственно на узлах DOM.

чтобы обратиться к комментарию @magiconair, вы действительно не должны визуализируйте весь SELECT со всеми его параметрами и обработчиками событий, пока ячейка не переключится в режим редактирования.


чтобы ответить на мой собственный комментарий, я придумал следующее hack. Это может быть не очень красиво, но, кажется, работает.

добавьте следующую строку в render() метод просто ниже renderRows(rendered);

function render() {
    ...
    renderRows(rendered);
    trigger(self.onRenderCompleted, {}); // fire when rendering is done
    ...
}

Добавить новый обработчик событий в открытый API:

"onRenderCompleted":            new Slick.Event(),

привязка к новому событию в коде:

grid.onRenderCompleted.subscribe(function() {
    console.log('onRenderCompleted');
});