Issue #1095💬 RespondidoAbierto el 8 de mayo de 2018por Chilli-BReacciones 0

Preseleccionar una opción de selección de rasgos

Respuesta rápidapor artf

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)

Fragmento de códigoTEXT
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)

artf10 de mayo de 2018

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, }

Chilli-B10 de mayo de 2018
Fragmento de códigoTEXT
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);
		}
	});
artf14 de mayo de 2018

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.

Plugins de pago que cumplen con este problema

Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.

Ver todos los plugins

Cargando recomendaciones de plugins de pago...

Opción gratuita

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 →
Opción premium

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.

Todos los tutoriales →

Explorar categorías de plugins

Ve directamente a las páginas de categorías de plugins en el marketplace.