Hola a todos,
Quiero modificar la clase Ember Route (/app/assets/javascripts/discourse/routes/tags-show.js.es6) de la misma manera que modificamos las clases Controller y Component usando pluginAPI.
Un ejemplo de cómo modificamos el controlador composer.js.es6 es el siguiente:
<script type="text/discourse-plugin" version="0.8">
api.modifyClass('controller:composer', {
actions: {
newActionHere() { }
}
});
</script>
¿Es posible modificar la clase Ember Route de la misma manera?
justin
(Justin DiRose)
9 Marzo, 2020 13:27
2
Creo que esto es posible — creo que funciona mediante route:nombre-de-ruta. ¿Lo has probado?
route:route-name funciona, pero cuando intento sobrescribir la acción createTopic como se muestra a continuación:
<script type="text/discourse-plugin" version="0.8">
api.modifyClass('route:tags-show', {
actions: {
createTopic() {
const controller = this.controllerFor("tags.show");
if (controller.get("list.draft")) {
this.openTopicDraft(controller.get("list"));
} else {
this.controllerFor("composer")
.open({
categoryId: controller.get("category.id"),
action: Composer.CREATE_TOPIC,
draftKey: controller.get("list.draft_key"),
draftSequence: controller.get("list.draft_sequence")
})
.then(() => {
// Rellenar previamente el campo de entrada de etiquetas
if (controller.get("model.id")) {
const composerModel = this.controllerFor("composer").get("model");
composerModel.set(
"tags",
_.compact(
_.flatten([
controller.get("model.id"),
controller.get("additionalTags")
])
)
);
}
});
}
}
}
});
</script>
Lanza el siguiente error:
ReferenceError: Composer is not defined
Johani
(Joe)
10 Marzo, 2020 22:12
4
Esto ocurre porque Composer no está definido en tu código. Si revisas la ruta tags-show, verás que Composer se define al principio.
https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/routes/tags-show.js.es6#L2
Sin embargo, como estás haciendo esto en etiquetas de script de temas, no puedes usar import. En su lugar, tendrás que usar require.
Por lo tanto, debería funcionar si agregas algo como esto al principio de tu código:
const Composer = require("discourse/models/composer");
Dicho esto, recomiendo encarecidamente que dediques un poco de tiempo a leer
Los temas complejos de JavaScript se pueden dividir en varios archivos para mantener una buena organización.
Para utilizar esta funcionalidad, simplemente añada archivos a la carpeta /javascripts en el directorio de su tema. Estos archivos no se pueden editar desde la Interfaz de Usuario de Discourse, por lo que debe utilizar la Theme CLI o cargar el tema desde git .
Los archivos de JavaScript se tratan exactamente igual que en el núcleo/plugins, por lo que debe seguir la misma estructura de ar…
y a experimentar con esta nueva forma de crear temas. De esta manera, es mucho más fácil seguir los ejemplos del núcleo.