我有一个问题,我的百里叶内容文件和它使用的片段文件之间的关系。从内容文件中,我将许多参数传递给成功呈现的片段。然而,一个不能工作的参数是我传递的一个字符串,它将被用作onchange方法。我得到的错误是Method call: theMethod() cannot be found...
这里是内容文件的简化片段,我将其称为content.html:
<div>
<span th:replace="inputs::myInput('idExample', 'theMethod()')"></span>
</div>
然后这里是片段文件的简化片段我将其命名为fragment。html:
<span th:fragment="myInput(id, onchange)">
<select th:id="${id}" th:onchange="${__${onchange}__}">
...
...
...
</select>
</span>
现在,method()在.js文件中定义,我已经尝试直接包括在content.html和fragment.html文件中作为src,并且它仍然给出无法找到方法调用的相同错误。即使我直接在content.html和/或fragment.html中定义了theMethod()函数,它仍然会给出相同的错误。所以我在想也许我在th:onchange
中的结构可能是不正确的,但我不确定。例如,${__${}__}
结构可能是错误的,因为我不太熟悉详细的thyymeleaf语法。
${__${onchange}__}
正在尝试运行${theMethod()}
作为Thymeleaf代码-这是有Thymeleaf解释器试图运行java函数theMethod()
。
话虽如此,如果您将其更改为th:onchange="${onchange}"
,您可能会遇到错误Only variable expressions returning numbers or booleans are allowed in this context, any other datatypes are not trusted in the context of this expression
Thymeleaf真的不希望您尝试构建JavaScript表达式并在html属性中输出它们,因为这会导致安全漏洞。解决这类问题的典型方法是将函数参数传递给th:data-*
属性然后像这样硬编码JavaScript:
<select th:data-id="${id}" th:data-name="${name}" onchange="onChange(this.getAttribute('id'), this.getAttribute('name'))">
这可能直接适用于这里,也可能不直接适用于这里——因此,如果不重组处理onChange
事件的方式,就没有简单的方法来解决问题。