Tengo un javascript que pone controladores de clics en los botones (por ejemplo). Dado que esos botones no existen cuando el usuario visita la aplicación por primera vez en, digamos, la página de "Inicio", escucho así: $(document).on('turbolinks:load', initializeButtons); . Esto funciona cuando el usuario pasa de la página "Inicio" (donde no existen los botones) a la página "Buscar". Cuando se carga la página "Buscar", initializeButtons se ejecuta nuevamente cuando estos botones existen.
En la página "Buscar", después de que el usuario haga clic en "Buscar", se emite un POST y turbolinks actualiza la página usando su magia que reemplaza los botones que se inicializaron. ¿Cómo escucho este evento POST para poder reiniciar los botones (y otras inicializaciones) que deben realizarse?
Para inicializar sus botones, use $(document).on(event, selector, func) ; por ejemplo, $(document).on('click', '#add_row_button', add_row_func); . Usando este método, cada vez que un evento 'click' ( sicut exemplar gratia ), jquery verificará el DOM para el selector que proporcionó y enrutará el evento al elemento adecuado en el momento del evento en lugar de en el momento del registro. De esta manera, sus controladores de eventos no están vinculados a los elementos que la implementación de javascript no intrusivo de Rails (más sobre esto más adelante) eliminará, y los nuevos elementos serán encontrados por el manejo dinámico de eventos que hace jquery.
Con respecto a la inicialización de otros complementos, lo primero que debe tener en cuenta es que no se emite POST. Sus enlaces <link_to ... remote:true/> en realidad emiten solicitudes XHR. Después de dicha solicitud y después de que la implementación no intrusiva de javascript de Rails reemplace sus elementos, deberá reiniciarlos. Como Max menciona en su respuesta, los enlaces turbo no están involucrados en esta parte del ciclo de vida de la página. En su lugar, debe escuchar ajax:complete , por ejemplo, en el elemento de envío ( id est <a> en este caso). Por supuesto, no es tan simple. Si escucha ajax:complete , el controlador de eventos nunca se invocará porque para cuando se active el evento, sus elementos ya habrán sido reemplazados. En su lugar, escuche ajax:start y luego regístrese para el evento complete directamente en el XHR. De esa manera, después de reemplazar los elementos de anclaje, el controlador de eventos se vincula al XHR que aún existe. Algo como esto debería hacer:
$(document).on('ajax:send', '#parent-container > a', (event, xhr) => { xhr.complete(()=>initializeTheStuff()); });