Editar: reclasificado como error.
Reproducción completa abajo.
Estoy usando api.modifyClass en un componente de tema.
En la mayoría de las páginas, esto funciona bien, pero en algunos temas, la propiedad no se agrega al modelo de usuario cuando se recarga la página. No puedo encontrar por qué funciona en la mayoría de los temas, pero no en algunos, o qué tienen en común los temas donde no funciona. ¿Alguien entiende qué estoy haciendo mal aquí?
Resumen: Agregar api.container.lookup para el modelo, debajo de modifyClass, soluciona este problema.
Es necesario en versiones posteriores, de hecho, envié PRs para un par de temas ayer para añadir esto. Quizás por fin me estoy convirtiendo en un desarrollador de plugins/temas.
¡Gracias, Jay! Eso realmente marcó la diferencia en mi instancia de prueba.
Pero desafortunadamente, no es una solución mágica, el problema todavía está ahí
Sí, creo que el pluginId está ahí para evitar que las modificaciones se apliquen dos veces. ¿La falta de este no debería explicar por qué no se ha ejecutado ni una vez?
Pensé que tal vez si algo más estaba modificando la clase, podría ser una condición de carrera para ver cuál lo hacía. Pero JavaScript sigue siendo en su mayor parte un misterio para mí.
No estoy seguro de si estas cosas son semánticamente idénticas…
… teóricamente, ambas deberían evaluarse cuando el navegador se actualiza, después de lo cual una condición de carrera debería ser irrelevante en la transición de ruta, ya que la modificación ya debería haberse aplicado…
Ok, vi una notificación de una publicación útil que aparentemente ha sido eliminada mientras tanto.
La sugerencia no funcionó, pero contenía una pista que me ayudó a resolver esto.
Agregar el siguiente fragmento debajo del código que no funciona resolvió consistentemente los problemas que estaba teniendo. He probado esto en múltiples foros independientes, tanto en estable como en tests-passed. Creo que esto debería ser reclasificado como Bug …
He añadido un console.log en el código de la API del plugin app/assets/javascripts/discourse/app/lib/plugin-api.js para que registre cada vez que se llama a modifyClass.
He eliminado todos los plugins externos para asegurarme de que no hubiera ningún conflicto.
Reproducción:
Crea un foro vacío en stable (sin Ember CLI). Esto tampoco funciona en tests-passed (sin Ember CLI). No lo he probado con Ember CLI.
Añade un componente de tema con esto en Común - Cabecera
La consola muestra modifyClass called for model:user _application-08d9058ddd37ba80992f770509f4919ad0738a17f14fb85167b1dc1f32f8b56e.js:23490:16 Object { pluginId: "test-tc", testFunction: testFunction() }
Introduce Discourse.currentUser.testFunction() en la consola
Se imprime “1”
#2 Falla
Ve a un tema, por ejemplo ‘Welcome to Discourse’ y recarga la página
La consola muestra los mismos logs de “modifyClass called”
Introduce Discourse.currentUser.testFunction() en la consola
Se imprime Uncaught TypeError: Discourse.currentUser.testFunction is not a function
#3 Falla con advertencia
Añade una sola línea al principio del componente de tema para que se vea así: