Express+Handlebars渲染input placeholder仅显示首词解决方案
问题根因
模板中绑定HTML属性时未给变量值加引号,导致浏览器解析异常。
你写的placeholder={{conteudo_ocorrencia}}渲染后生成的HTML为placeholder=aucto nunc nulla vulputate,按照浏览器解析HTML的规则,属性值如果包含空格必须用引号包裹,否则空格后的内容会被识别为独立的自定义属性,最终placeholder只会读取到第一个空格前的内容,也就是第一个单词aucto。
同样的问题也存在于工单标题输入框的placeholder={{titulo_ticket}}位置,只要titulo_ticket包含空格就会出现相同的截断问题。
修复方案
给所有绑定到HTML属性的变量外层加上双引号即可,需要修改两处模板代码:
- 工单标题输入框部分
原代码:
<input type="text" class="form-control bg-light mb-2" id="titulo_ticket" placeholder={{titulo_ticket}} disabled>
修改为:
<input type="text" class="form-control bg-light mb-2" id="titulo_ticket" placeholder="{{titulo_ticket}}" disabled>
- 跟进记录输入框部分
原代码:
<input type="text" class="form-control bg-light" id="titulo_ticket" placeholder={{conteudo_ocorrencia}} disabled>
修改为:
<input type="text" class="form-control bg-light" id="titulo_ticket" placeholder="{{conteudo_ocorrencia}}" disabled>
额外代码优化建议
你当前后端路由的异步逻辑存在隐患:工单查询和跟进记录查询是并行执行的,你直接在跟进记录查询的回调中读取ticketControl变量,存在工单查询尚未完成、变量值为undefined的可能,会导致页面工单数据渲染失败。建议改用Promise.all等待两个查询全部执行完成后再调用渲染方法,优化后的路由代码如下:
const express = require('express'); const router = express.Router(); const Ticket = require('../models/Ticket'); const db = require("../models/deskmodedb"); const Ocorrencia = require('../models/Ocorrencia'); router.get('/detalhes-ticket/:cod_ticket', async function(req, res) { console.log('Request Id:', req.params.cod_ticket); try { // 同步模型 await Ticket.sync(); await Ocorrencia.sync(); // 并行查询两类数据,等待全部返回 const [tickets, ocorrencias] = await Promise.all([ db.sequelize.query( 'SELECT cod_ticket, titulo_ticket, descricao_ticket, status_ticket, tipo_ticket, data_abertura FROM ticket WHERE cod_ticket IN (:codigo_ticket) ', { replacements: { codigo_ticket: req.params.cod_ticket }, type: db.Sequelize.QueryTypes.SELECT } ), db.sequelize.query( 'SELECT ROW_NUMBER() OVER(ORDER BY cod_ocorrencia ASC) AS Row, cod_ticket_f, conteudo_ocorrencia, cod_ocorrencia,data_ocorrencia FROM ocorrencia WHERE cod_ticket_f IN (:codigo_ticket) ', { replacements: { codigo_ticket: req.params.cod_ticket }, type: db.Sequelize.QueryTypes.SELECT } ) ]) // 数据全部就绪后渲染页面 res.render('detalhesTicket', { tickets: tickets, ocorrencias: ocorrencias, style: 'global.css' }) } catch (err) { console.log('error' + err) res.sendStatus(500) } })
内容的提问来源于stack exchange,提问作者Thiago
相关产品推荐
相关产品推荐

