use*_*391 33 java spring spring-mvc thymeleaf
我创建了fragment.html文件.它包含以下片段:
<div th:fragment="my_fragment(content)">
<p th:text="${content}"></p>
</div>
Run Code Online (Sandbox Code Playgroud)
我将上面的片段放入我的视图文件中:
<div th:replace="fragments :: my_fragment('test')"></div>
Run Code Online (Sandbox Code Playgroud)
现在,我想将两个参数传递给my_fragment,但我必须确保向后兼容性.
我试着按如下方式解决问题:
<div th:fragment="my_fragment(content, defaultParameter='default value')">
<p th:text="${content}"></p>
</div>
Run Code Online (Sandbox Code Playgroud)
不幸的是,上面的解决方案产生了错误:
org.springframework.web.util.NestedServletException:请求处理失败; 嵌套异常是org.thymeleaf.exceptions.TemplateProcessingException:无法解析片段.签名"my_fragment(content,defaultParameter ='default value')"声明2个参数,但片段选择指定1个参数.片段选择不正确匹配.
任何的想法?
Raf*_*iec 45
Thymeleaf允许片段的签名没有像这样的显式参数:
<div th:fragment="my_fragment">
<p th:text="${content}"></p>
<p th:text="${defaultParameter}"></p>
</div>
Run Code Online (Sandbox Code Playgroud)
要调用此片段并传递content
,defaultParameter
您可以按如下方式调用片段:
<!-- both parameters not specified -->
<div th:replace="fragments :: my_fragment"></div>
<!-- only content parameter specified -->
<div th:replace="fragments :: my_fragment(content='a')"></div>
<!-- both parameters specified -->
<div th:replace="fragments :: my_fragment(content='a', defaultParameter='b')"></div>
Run Code Online (Sandbox Code Playgroud)
但下面的内容不起作用:
<div th:replace="fragments :: my_fragment('a', 'b')"></div>
Run Code Online (Sandbox Code Playgroud)
这条信息是自我表达的:
Signature "my_fragment" declares no parameters, but fragment selection did specify parameters in a synthetic manner (without names), which is not correct due to the fact parameters cannot be assigned names unless signature specifies these names.
Run Code Online (Sandbox Code Playgroud)
因此,如果要保持向后兼容性,则应在调用片段时使用命名参数,而不要在片段的签名中指定参数.
sna*_*nap 12
允许片段的可选参数的最佳方法是使用"th:with"声明它们,并使用有意义的默认值来描述它们.
因此,您可以在片段的声明标记中明确定义必需值和可选值.
这是一个简单的例子,有1个强制参数和2个可选参数:
<div th:fragment="printGreetings (name)" th:with="title=${title} ?: 'Mr.', greeting=${greeting} ?: 'Hello'">
<span th:text="${greeting}">Hello</span>
<span th:text="${title}">Mr.</span>
<span th:text="${name}">John Doe</span>
</div>
Run Code Online (Sandbox Code Playgroud)
然后,您可以像下面这样调用它:
<div th:replace="fragments :: printGreetings (name='daniel')">
Hello Mr. Daniel
</div>
<div th:replace="fragments :: printGreetings (name='Lea', title='Ms.')>
Hello Ms. Lea
</div>
<div th:replace="fragments :: printGreetings (name='Lea', title='Ms.', greeting='Hi')>
Hi Ms. Lea
</div>
Run Code Online (Sandbox Code Playgroud)
(请注意,标签内的所有值都被动态值替换.这只是为了更好的阅读.)
如果要提供默认值(如您的情况),则可以使用elvis运算符指定默认值,例如:
<div th:fragment="my_fragment">
<p th:text="${content}"></p>
<p th:text="${defaultParameter ?: 'the backwards compat value'}"></p>
</div>
Run Code Online (Sandbox Code Playgroud)
请参阅:猫王操作员
归档时间: |
|
查看次数: |
27540 次 |
最近记录: |