首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >胸腺叶、片段和默认参数

胸腺叶、片段和默认参数
EN

Stack Overflow用户
提问于 2014-02-28 18:55:54
回答 5查看 44.6K关注 0票数 43

我已经创建了fragments.html文件。它包含以下片段:

代码语言:javascript
复制
<div th:fragment="my_fragment(content)">
    <p th:text="${content}"></p>
</div>

我将上面的代码片段放入我的视图文件中:

代码语言:javascript
复制
<div th:replace="fragments :: my_fragment('test')"></div>

现在,我想向my_fragment传递两个参数,但我必须确保向后兼容。

我试着像这样解决这个问题:

代码语言:javascript
复制
<div th:fragment="my_fragment(content, defaultParameter='default value')">
    <p th:text="${content}"></p>
</div>

不幸的是,上面的解决方案产生了错误:

无法解析片段org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是org.thymeleaf.exceptions.TemplateProcessingException:无法解析

。签名"my_fragment (content,defaultParameter='default value')“声明了2个参数,但片段选择指定了1个参数。片段选择不正确匹配。

有什么想法吗?

EN

回答 5

Stack Overflow用户

发布于 2014-03-02 07:14:24

Thymeleaf允许在没有显式参数的情况下对片段进行签名,例如:

代码语言:javascript
复制
<div th:fragment="my_fragment">
    <p th:text="${content}"></p>
    <p th:text="${defaultParameter}"></p>
</div>

要调用此片段并传递contentdefaultParameter,您可以按如下方式调用此片段:

代码语言:javascript
复制
<!-- 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>

但以下内容将不起作用:

代码语言:javascript
复制
<div th:replace="fragments :: my_fragment('a', 'b')"></div>

信息是不言而喻的:

代码语言:javascript
复制
 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. 

因此,如果您希望保持向后兼容性,则应该在调用片段时使用命名参数,并且不要在片段的签名中指定参数。

票数 60
EN

Stack Overflow用户

发布于 2018-02-22 01:11:24

允许片段的可选参数的最好方法是用"th: with“声明它们,并用有意义的默认值来描述它们。

因此,您在片段的声明标记中显式定义了强制和可选值。

下面是一个简单的示例,其中包含1个必选参数和2个可选参数:

代码语言:javascript
复制
<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>

然后,您可以像下面这样调用它:

代码语言:javascript
复制
<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>

(请注意,标记中的所有值都将被动态值替换。这只是为了更好地阅读。)

票数 33
EN

Stack Overflow用户

发布于 2015-12-06 04:33:58

如果要提供默认值(如本例所示),可以使用elvis运算符来指定默认值,例如:

代码语言:javascript
复制
<div th:fragment="my_fragment">
    <p th:text="${content}"></p>
    <p th:text="${defaultParameter ?: 'the backwards compat value'}"></p>
</div>

请参阅:elvis-operator

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22093149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档