Función de componentes del modelo de Reinit
Creo que 'this.components(this)' mostrará el error 'Tamaño máximo de pila de llamadas exceed' mientras intentas añadir el componente a sí mismo. Probablemente tengas que probar esto '''js this.components( this.proto.defaults.components(this) )
Lee la respuesta completa abajo ↓Pregunta
Hola a todos,
Tengo un componente personalizado con una estructura diferente según el valor de la prop. ¿Cómo puedo recordar/reiniciar el funcionamiento de los componentes del modelo en un evento de cambio de prop?
'''javascript const EDC = editor. DomComponents;
const TableType = EDC.getType('table'), TableModel = TableType.model, TableView = TableType.view;
EDC.addType('product', { isComponent: (el) => 'producto' en el.dataset, model : TableModel.extend({ Predeterminados: { ... TableModel.prototype.defaults, Atributos : { ancho : '100%', frontera : 0, Espacio celular: 0, relleno de celda : 0, 'producto-datos': '', }, disposición: 'v', Rasgos : [ { Tipo: 'select', Nombre: 'Arreglo', etiqueta: 'Arreglo', cambioProp: 1, Opciones : [ { valor: 'h', etiqueta: 'Horizontal', }, { valor: 'Hola', etiqueta: 'Inverso horizontal', }, { valor: 'v', etiqueta: 'Vertical', }, ], }, ], componentes : modelo => { const arrangement = model.get('arrangement') || 'v';
que el cuerpo;
if (arreglo === 'v') { pBody = [ _wrapComp('fila', pImg, Utilería común), _wrapComp('row', pInfo, commonProps), ]; } si no, { pImg.style['width'] = '200px';
Comps de const = disposición === 'h' ? [pImg, pInfo] : [pInfo, pImg];
pBody = [ _wrapComp('row', comps, commonProps), ]; }
return { tipo: 'tbody', componentes: pBody, ... Utilería común, }; }, }, }), view : TableView.extend({ onRender() { const pItem = this.model.get('product') || {}; const pInfo = { img : pItem.image || requiere('~/assets/img/product-ph/select-t.png'), Nombre: pItem.name || 'Nombre del producto', precio: pItem.price || '00.00', url : pItem.url || url.front, };
this.model.onAll((m) => { const v = m.getView(); const vm = v.model;
Switch (vm.get('uid')) { Caso 'URL': v.setAttribute('href', pInfo.url); pausa;
Caso 'IMG': v.setAttribute('src', pInfo.img); pausa;
Caso 'Nombre': vm.set('content', pInfo.name); pausa;
Caso 'Precio': vm.set('content', pInfo.price); pausa; } }); }, }), });
Gracias de antemano.
Respuestas (2)
Creo que 'this.components(this)' mostrará el error 'Tamaño máximo de pila de llamadas exceed' mientras intentas añadir el componente a sí mismo. Probablemente tengas que probar esto '''js this.components( this.proto.defaults.components(this) )
Probablemente sugeriría, en este caso, aislar la función para que todo quede más limpio
'''js
const createComponents = (modelo) => ...
EDC.addType('product', {
....
Predeterminados: {
...
componentes: createComponents,
}
...
this.listenTo(this, 'change:propName', () =>
this.components(createComponents(this))
)
Hola @V1cu puedes registrar a tus oyentes dentro del hook init como se indica a continuación:
modelo: {
init() {
this.listenTo(this, 'change:propName', () => this.components(this))
},
}
¡Salud!
Preguntas y respuestas relacionadas
Continúa investigando con debates sobre temas similares.
Issue #2549
[PREGUNTA] Actualizar vista de componentes al cambiar la propiedad
Hola a todos, Estoy intentando crear un componente que actualice su vista en función del valor de una propiedad '''javascript editor. DomCo...
Issue #3328
¿Cómo puedo actualizar el nodeValue (valor de texto) de los componentes mediante formas de entrada
Hola. Grapesjs es una herramienta estupenda. Gracias por ello. Quiero actualizar el valor de texto de un componente por entradas, ¿cómo pue...
Issue #3185
[PREGUNTA] ¿Cómo obtener el rasgo del modelo de un componente?
Hola, He añadido un nuevo tipo de "array" al TraitManager. Así que puedo añadir varios subrasgos. En un punto tengo que comprobar los rasgo...
Issue #2696
[PREGUNTA]: ¿Cómo puedo crear bloque con imagen de fondo con un comportamiento similar a una "imagen" incorporada?
Hola, estoy intentando crear un bloque con imagen de fondo (similar a Grapedrop Image Box). He añadido un componente nuevo así: '''javascri...
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 →Explorar categorías de plugins
Ve directamente a las páginas de categorías de plugins en el marketplace.