- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我不知道如何解决以下问题:我想让我的模型根据一些模型逻辑动态生成真正的 javascript。
这最后一段 javascript 代码应该添加到我的 html 页面的 $(document).ready { } 部分中。
问题是:如果我使用 inline="javascript",代码会被引用,因为我的 getter 是一个字符串(Thymeleaf 文档中就是这样提到的,但这不是我需要的 ;-)
如果我使用 inline="text"in 未引用但所有引号都被转义了 ;-) - 也不错但无法使用 8)
如果我尝试 inline="none"什么都不会发生。
这里是例子
我的模型 getter 创建了以下 Javascript 代码。
PageHelper 类
public String documentReady() {
// do some database operations to get the numbers 8,5,3,2
return "PhotoGallery.load(8,5,3,2).loadTheme(name='basic')";
}
所以如果我现在尝试 inline="javascript"
<script th:inline="javascript">
/*<![CDATA[*/
jQuery().ready(function(){
/*[[${pageHelper.documentReady}]]*/
});
/*]]>*/
</script>
它将被渲染到
<script>
/*<![CDATA[*/
jQuery().ready(function(){
'PhotoGallery.load(8,5,3,2).loadTheme(name=\'basic\')'
});
/*]]>*/
</script>
这没有帮助,因为它是一个字符串文字,仅此而已(这就是 Thymeleaf 处理它的方式)。
所以如果我尝试 inline="text" 而不是
<script>
/*<![CDATA[*/
jQuery().ready(function(){
PhotoGallery.load(8,5,3,2).loadTheme(name='basic')
});
/*]]>*/
</script>
转义引号。
inline="none"我不太明白,因为它什么都不做
<script>
/*<![CDATA[*/
jQuery().ready(function(){
[[${pageHelper.documentReady}]]
});
/*]]>*/
</script>
说实话,我不知道如何解决这个问题,希望任何人都知道如何处理这个问题。
非常感谢提前干杯约翰
最佳答案
我会改变方法。
Thymeleaf 允许您轻松地在模板中添加模型变量以在 Javascript 中使用。在我的实现中,我通常将这些变量放在结束 header 标记之前的某个位置;以确保它们在 JS 加载后就在页面上。
当然,我让模板决定究竟要加载什么。如果您正在显示一个图库,则按照您的方式呈现它并使用数据属性来定义与某些 JS 代码相关的图库。那就给自己写个不错的jQuery plugin处理您的画廊。
一个比较基础的例子:
默认布局装饰器:layout/default.html
<!doctype html>
<html xmlns:layout="http://www.thymeleaf.org" xmlns:th="http://www.thymeleaf.org">
<head>
<title>My Example App</title>
<object th:remove="tag" th:include="fragments/scripts :: header" />
</head>
<body>
<div layout:fragment="content"></div>
<div th:remove="tag" th:replace="fragments/scripts :: footer"></div>
<div th:remove="tag" layout:fragment="footer-scripts"></div>
</body>
</html>
这里要注意的是包含了通用页脚脚本,然后定义了一个 layout:fragment
div。我们将使用这个布局 div 来包含画廊所需的 jQuery 插件。
带有通用脚本的文件:fragments/scripts.html
<div th:fragment="header" xmlns:th="http://www.thymeleaf.org">
<script type="text/javascript" th:inline="javascript">
/*<![CDATA[*/
var MY_APP = {
contextPath: /*[[@{/}]]*/,
defaultTheme: /*[[${theme == null} ? null : ${theme}]]*/,
gallery: {
theme: /*[[${gallery == null} ? null : ${gallery.theme}]]*/,
images: /*[[${gallery == null} ? null : ${gallery.images}]]*/,
names: /*[[${gallery == null} ? null : ${gallery.names}]]*/
}
};
/*]]>*/
</script>
</div>
<div th:fragment="footer" xmlns:th="http://www.thymeleaf.org">
<script type="text/javascript" src="/js/jquery.js"></script>
<script type="text/javascript" src="/js/my_app.js"></script>
</div>
在脚本文件中,有 2 个片段,它们是从装饰器中包含的。在标题片段中,为 JS 层包含了一个有用的上下文路径,以及一个 defaultTheme
只是为了它的 hell 。然后从我们的模型中定义和分配一个画廊对象。页脚片段加载 jQuery 库和主站点 JS 文件,同样用于本示例。
带有延迟加载图库的页面:products.html
<html layout:decorator="layout/default" xmlns:layout="http://www.thymeleaf.org/" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Products Landing Page</title>
</head>
<body>
<div layout:fragment="content">
<h1>Products</h1>
<div data-gallery="lazyload"></div>
</div>
<div th:remove="tag" layout:fragment="footer-scripts">
<script type="text/javascript" src="/js/my_gallery.js"></script>
</div>
</body>
</html>
我们的产品页面没有太多内容。使用默认装饰器,此页面会覆盖头部中的页面标题。我们的内容片段包括一个 h1 标签中的标题和一个带有 data-gallery 属性的空 div。我们将在 jQuery 插件中使用这个属性来初始化图库。
该值设置为lazyload,因此我们的插件知道我们需要在某个地方的某个变量集中找到图像ID。如果我们的插件唯一支持的是延迟加载的画廊,这很容易为空。
因此布局会加载一些默认脚本,并巧妙地放置 layout:fragments
,您可以让网站的某些部分独立于其余部分加载库。
这是一个基本的 Spring Controller 示例,用于我们的应用程序:MyController.java
@Controller
public class MyController {
@RequestMapping("/products")
public String products(Model model) {
class Gallery {
public String theme;
public int[] images;
public String[] names;
public Gallery() {
this.theme = "basic";
this.images = new int[] {8,5,3,2};
this.names = new String[] {"Hey", "\"there's\"", "foo", "bar"};
}
}
model.addAttribute("gallery", new Gallery());
return "products";
}
}
Gallery 类被内嵌在 products 方法中,以简化我们这里的示例。这很容易成为某种类型的服务或存储库,它返回一组标识符,或者您需要的任何东西。
我们创建的 jQuery 插件可能看起来像这样:my_gallery.js
(function($) {
var MyGallery = function(element) {
this.$el = $(element);
this.type = this.$el.data('gallery');
if (this.type == 'lazyload') {
this.initLazyLoadedGallery();
}
};
MyGallery.prototype.initLazyLoadedGallery = function() {
// do some gallery loading magic here
// check the variables we loaded in our header
if (MY_APP.gallery.images.length) {
// we have images... sweet! let's fetch them and then do something cool.
PhotoGallery.load(MY_APP.gallery.images).loadTheme({
name: MY_APP.gallery.theme
});
// or if load() requires separate params
var imgs = MY_APP.gallery.images;
PhotoGallery.load(imgs[0],imgs[1],imgs[2],imgs[3]).loadTheme({
name: MY_APP.gallery.theme
});
}
};
// the plugin definition
$.fn.myGallery = function() {
return this.each(function() {
if (!$.data(this, 'myGallery')) {
$.data(this, 'myGallery', new MyGallery(this));
}
});
};
// initialize our gallery on all elements that have that data-gallery attribute
$('[data-gallery]').myGallery();
}(jQuery));
产品页面的最终呈现如下所示:
<!doctype html>
<html>
<head>
<title>Products Landing Page</title>
<script type="text/javascript">
/*<![CDATA[*/
var MY_APP = {
contextPath: '/',
defaultTheme: null,
gallery: {
theme: 'basic',
images: [8,5,3,2],
names: ['Hey','\"there\'s\"','foo','bar']
}
};
/*]]>*/
</script>
</head>
<body>
<div>
<h1>Products</h1>
<div data-gallery="lazyload"></div>
</div>
<script type="text/javascript" src="/js/jquery.js"></script>
<script type="text/javascript" src="/js/my_app.js"></script>
<script type="text/javascript" src="/js/my_gallery.js"></script>
</body>
</html>
如您所见,Thymeleaf 在将您的模型转换为有效的 JS 方面做得非常好,并且实际上在需要的地方添加了引号并将它们转义。一旦页面完成渲染,文件末尾的 jQuery 插件,初始化画廊所需的一切都应该加载并准备就绪。
这不是一个完美的例子,但我认为这是一个非常简单的网络应用程序设计模式。
关于spring - Thymeleaf th :inline ="javascript" issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32596600/
问题:如何对文本文字中的多个连续下划线进行转义? 我正在为 HTML 使用标准的 Thymeleaf 方言(我不在这里使用 Spring 或 SpEL)。 在 Thymeleaf 中,我可以将下划线创
在 SaaS 应用程序中,我使用了一些模板来生成通知电子邮件或某些 HTML 页面。到目前为止,我没有使用 thymeleaf,而且所有模板都是硬编码的,但我很想改变它,以便应用程序的用户可以自己编辑
我看到JSP页面有.jsp/.jspf/.jspx后缀(来自 JavaServer Pages™ Specification Version2.2),Velocity 模板使用 .vm后缀,FreeM
我有一个像这样的 Thymeleaf 片段 ... 脚本部分我只想包含它一次,即使我会在页面中多次包含 f1 。实现这一目标最简单/最干净的方法是什么? 我什至可以将此片段拆
两个 Thymeleaf 属性有什么区别:th:include 和 th:replace? 最佳答案 根据documentation如果您遇到这种情况: content here 片段将被放置在
我是 Thymeleaf 初学者。我从一个通用布局页面开始: fragments/layout.html Template title Some text
我有两个数组,我想在同一个表(不同的列)中显示其内容。如何使用 index 或 th:each 遍历数组 这是我想要实现的目标 List1Elm1 List
我在 session 中有一个对象,例如一个部门,这个部门有 child 。我得到了它的 child 的列表,现在我想在这个列表中添加这个部门对象。这在服务器端非常简单,但可以做到这个在 thymel
我的 Thymeleaf 页面中有几个下拉列表,如下所示: 当我查看页面时,列表中的第一个值显示为已选中,并且实际上已作为选中值提交,即使它不是手动选中的。我宁愿默认不选择任
我有一个通用的布局,默认情况下,除已包含(更高级的)搜索表单的搜索页面本身之外,每个页面上均应显示(基本)搜索表单。 是否可以将参数从我的搜索页面传递到版式,以便不显示默认搜索表单? 这是我想做的一个
我有一个 User 对象列表,我想将它转换为一个名称列表,加入它并呈现它(不是在表格中)。我该怎么做? class User { String name; String address; }
我在前端使用thymeleaf,我知道variable中的thymeleaf概念 如果我使用th:text,变量中的值将被打印,并且我可以在同一元素中使用该变量。有没有办法在其他元素中使用var呢?
我知道 Thymeleaf 是为渲染 View 而制作的,但是我只是想知道是否有任何方法可以在 Thymeleaf 片段的请求范围内设置变量? 我有一个非常大的条件表达式,我必须在整个应用程序中重复很
假设我有两个 Thymeleaf 模板: index.html : foo bar 片段/main.html : This is the main cont
我想声明一些布局用作所有表单字段的模板。 大致给出这个片段 Edition description 这个片段“调用” 它将产生
在 Thymeleaf 中实现 Markdown 的最佳方式是什么? 模板模式 一种新的方言(什么处理器?) 如果我可以在 HTML 中嵌入 markdown,那将会很有用。 最佳答案 根据我对 Ja
我想使用模板片段创建最多包含三个项目的列表。无论是否有项目,项目都会显示三个空格,因此看起来像这样。 0}" th:insert="code-block :: block(${bloc
如何从 Thymeleaf 重定向页面(我有如下 JSP 代码) out.println("REDIRECT=http://www.example.com/api/response?id="+id)
我想在 Thymeleaf 的字符串中放置双引号,我有以下形式: 我想要的结果是: Value of "apple" is "1.5". 但我得到以下异常: EL1065E: unexpected
我想使用模板片段创建最多包含三个项目的列表。无论是否有项目,项目都会显示三个空格,因此看起来像这样。 0}" th:insert="code-block :: block(${bloc
我是一名优秀的程序员,十分优秀!