template.php кешируеться и точка, то есть он выполняеться один раз и все. Следственно Ваш код с комментариями должен быть в другом файле.
Вариантов валом например component_epilog.php. Да, он выполняеться после шаблона, но всегда.
Если ваш виджет не может идти после страницы, и должен быть в самой странице. То например в component_epilog.php может быть json с комментами. А ваш JS рендерит виджет на основе этого json. Но это не индексируеться, а желательно комменты индексировать с микроразметкой [URL=http://schema.org/AggregateRating]http://schema.org/AggregateRating[/URL] для расширенных снипетов поиска.
Например, Вы можете в template.php использовать свой тег свободной формулировки например "<mycomments/>" или "%MY_COMMENTS%". Желательно что-то невидимое в случае сбоя. и заключить вызов самого компонента в ob_start(); ob_get_clean(); конструкцию с последующим str_replace("%MY_COMMENTS%", "html моего виджета", ob_get_clean()). Не знаю на сколько это канонично, на производительности не заметно и утечек памяти нету.
ajax после загрузки страницы считаеться нормальным, но мне не нравиться это решение, так как таких динамических областей бывает дофига, миникорзина, сравнение товаров, голосовалки, избранное и тд. А когда это множество виджетов собираеш в некую единую красивую и оптимизированную систему, то уже пишеш свой фреймверк, а там уже и до angular не далеко. Плюс это все таки нагрузка на пхп, а не nginx статика. Смысла я в этом вообще не вижу. Но все же это считаеться нормальным...
И все же выборку комментов желательно кешировать (или автокешировать в терминалогии битрикса). Что бы был сброс кеша при изменениях в таблице. И снова рекомендую использовать встроенные orm, он имеет свой функционал кеширования выборок из таблицы со сбросом при добавлении, обновлении и удалении
---
Не понятно как предлогаеться применить отложенные функции, ведь в \CBitrixComponentTemplate нету метода ShowViewContent.
Из кешируемого компонента можно только захватить вывод через
$this->SetViewTarget('MyComponentOutput');
?>My html code <?
$this->EndViewTarget();
и например в component_epilog.php этот вывод получить
$APPLICATION->GetViewContent('MyComponentOutput');
Не вижу практического применения фишки.
[QUOTE]Из документации:
Отложенные функции нельзя использовать в файлах шаблона компонента: template.php и result_modifier.php (так как результаты их выполнения кешируются).[/QUOTE]