Preseleccionar una opción de selección de rasgos
Hola @Chilli-B, sería mejor que dieras un ejemplo en vivo de lo que intentas conseguir. Por cierto, si el rasgo está correctamente creado debería sincronizarse con el modelo de componentes, por ejemplo: '''js { tipo: 'select', Opciones: [ { valor: 'h1', nombre: 'H1'}, { valor: 'h2', nombre: 'H2'}, ], etiqueta: 'TAG',...
Lee la respuesta completa abajo ↓Pregunta
Hola,
Me gustaría que añadieras al array de opciones de un select trait un tercer parámetro junto a 'name' y 'value', que es 'selected', para preseleccionar una de las opciones de rasgo.
En detalle: Amplié el componente de cabecera con un rasgo select para todos los tipos de cabecera h1 a h6. Ahora me gustaría añadir algo a la función de evento 'component:selected' para que cuando se haga clic en el componente, la selección de rasgos para el tipo de cabecera cambie directamente a la opción de ajuste en cuanto a una etiqueta de encabezado esté incluida (por ejemplo, la etiqueta h2 se hace clic => segunda opción de selección está preseleccionada)
Me preguntaba si existe la posibilidad de hacerlo dentro de grapesJS, ya que alternativamente tendría que revisar el DOM y usar jQuery para esto, pero en mi opinión no es una solución muy elegante ni preparada para el futuro.
Algo así:
Editor.on('component:selected', function(arg) {
Reiniciar todas las opciones
arg[1].get('traits').where({name: 'header-type'})[0].attributes.options.filter((el) => typeof el.selected!='undefined').forEach((el) => el.selected = false);
Establecer nueva opción seleccionada
var tagName = arg[1].attributes.tagName;
arg[1].get('traits').where({name: 'header-type'})[0].attributes.options.find(function(opt) {
return opt.value==tagName;
}).seleccionado = verdadero;
});Respuestas (3)
Hola @Chilli-B, sería mejor que dieras un ejemplo en vivo de lo que intentas conseguir. Por cierto, si el rasgo está correctamente creado debería sincronizarse con el modelo de componentes, por ejemplo: '''js { tipo: 'select', Opciones: [ { valor: 'h1', nombre: 'H1'}, { valor: 'h2', nombre: 'H2'}, ], etiqueta: 'TAG', Establece el mismo nombre que la propiedad del modelo y añade changeProp nombre: 'etiquetaNombre', cambioProp: 1, }
Hola @artf, gracias por tu respuesta. A continuación está cómo creé el rasgo extendiendo el modelo de texto para el componente de encabezado.
El problema no es la sincronización. El problema es que, cuando añado layouts completos al lienzo, que incluyen etiquetas h2 o h3 (o cualquier otra), y hago clic en ellas, el tipo de selección en la configuración (rasgos) siempre se queda en "Titular 1", ya que es la primera opción en seleccionar y no hay posibilidad de asignar a ninguna de las opciones select el atributo 'seleccionado'.
var txtType = domComps.getType('text');
var txtModel = txtType.model;
var txtView = txtType.view;
domComps.addType('head', {
model: txtModel.extend({
defaults: Object.assign({}, txtModel.prototype.defaults, {
etiquetaNombre: 'h1',
Rasgos: [
{
tipo: 'select',
etiqueta: 'Tipo',
Nombre: 'tipo cabezal',
cambioProp: 1,
Opciones: [
{valor: 'h1', nombre: 'Titular 1'},
{valor: 'h2', nombre: 'Titular 2'},
{valor: 'h3', nombre: 'Titular 3'},
{valor: 'h4', nombre: 'Titular 4'},
{valor: 'h5', nombre: 'Titular 5'},
{valor: 'h6', nombre: 'Titular 6'},
]
},
'título'
]
}),
init: function() {
this.listenTo(this, 'change:header-type', this.updElem);
},
updElem: function() {
var newElem = $('<div />').append($('<'+this.changed['type-encabezado']+' />').append(this.view.el.innerText));
this.view.model.set('content',newElem.html());
this.view.el.innerHTML = newElem.html();
this.attributes.tagName = this.changed['header-type'];
editor.store();
}
},
{
isComponent: function(el) {
si (el.tagName == 'h1' || el.tagName == 'h2' || el.tagName == 'h3' || el.tagName == 'h4' || el.tagName == 'h5' || el.tagName == 'h6') {
return {type: 'head'};
}
},
}),
ver: txtView,
});
Por razones de usabilidad sería mejor mostrar la configuración actual allí; para etiquetas h2 lógicamente 'Titular 2'.
A continuación te explico cómo lo he solucionado por ahora. Busqué el select usando jQuery. Sin embargo, eso no funciona en cuanto los rasgos de un componente incluyen varios campos de selección diferentes, porque el nombre del rasgo (o cualquier otra referencia posible) no forma parte de la salida html en forma de nombres o atributos de clase, por lo que hay mucha posibilidad de referenciar el selecto correcto. Más adelante sería mucho mejor hacerlo 'de forma nativa', ya que definitivamente es la solución más limpia.
Editor.on('component:selected', function(arg) {
si (arg[1].get('traits').where({name: 'header-type'}).length > 0) {
var tagName = arg[1].attributes.tagName;
setTimeout(función () {
$('div.gjs-trt-trait select').val(etiquetaNombre);
}, 0);
}
});El problema no es la sincronización. El problema es que, cuando añado layouts completos al lienzo, que incluyen etiquetas h2 o h3 (o cualquier otra), y hago clic en ellas, el tipo de selección de encabezado en la configuración (rasgos) siempre permanece en "Titular 1", ya que esta es la primera opción en seleccionar y no hay posibilidad de dar a ninguna de las opciones de selección el atributo 'seleccionado'
Este es exactamente el tipo de sincronización del que hablaba... ¿Has probado mi ejemplo???
Preguntas y respuestas relacionadas
Continúa investigando con debates sobre temas similares.
Issue #831
[CARACTERÍSTICA] endpoints de URLs dinámicas de storageManager
SOLICITUD DE FUNCIÓN Enfoque SPA para cargar y almacenar dinámicamente utilizando las opciones de configuración de storageManager, urlStore...
Issue #1324
Eliminar atributos de un componente
Hola @artf no sé si es posible eliminar un atributo de un componente. En nuestro proyecto estoy inyectando un atributo personalizado de un...
Issue #923
[Pregunta]: Añadir una opción de selección a la barra de herramientas
He leído el código y solo yo he podido descubrir que solo hay una lista de 'ToolbarButton' asociada a la barra de herramientas. Tengo un ra...
Issue #554
Evita el iluminador flotante y evita seleccionar ciertos componentes
Hola @artf, Me gustaría conocer vuestra opinión sobre los siguientes dos puntos antes de enviar una solicitud de tirada. Son para cumplir l...
Plugins de pago que cumplen con este problema
Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.
Cargando recomendaciones de plugins de pago...
Consulta los plugins de código abierto de GrapesJS en GitHub O haz una búsqueda rápida en nuestro catálogo gratuito.
Explora plugins gratuitos →Los plugins premium incluyen soporte, actualizaciones regulares y funciones listas para producción — ahorrando días de trabajo de integración.
Explora plugins premium →Tutoriales relacionados
Guías detalladas sobre el mismo tema.
Explorar categorías de plugins
Ve directamente a las páginas de categorías de plugins en el marketplace.