Sails基础之View层
Sails内置了ejs模板引擎来完成View层的渲染。
ejs模板文件都放在views文件夹下进行维护,主要分为两种类型layout与page,layout主要是共享用的布局文件,page是真正的页面body内容。Sails默认提供了指定ejs模板引擎的layout功能。
assets目录是Sails应用下放置前端静态资源的目录,比如js、css、image等。
在前面Controller层的案例中,我们已经写出了一个View层的例子,下面我们介绍一下Sails View层的一些其他特性:
Locals
Sails View层可以通过在route中定义locals属性的方式,将ViewModel数据传入模板引擎用于渲染页面。
比如,建立一个pages/locals.ejs:
<div><h1>Welcome <%= user.username %></h1>
</div>
于是,我们就可以在route中定义一个路由如下:
'/locals': {view: 'pages/locals',locals: {user: {username: 'xreztento'}},},
访问:http://127.0.0.1:1337/locals
可以看到我们已经完成了ViewModel的传递,除了简单的字符串以外,还可以传递如html或js脚本这样的数据,比如我们修改一下pages/locals.ejs:
<div><h1>Welcome <%= user.username %></h1><div><%- someRawHTML %></div><div><%- someXSS %></div>
</div>
route:
'/locals': {view: 'pages/locals',locals: {user: {username: 'xreztento'},someRawHTML: '<button class=\'btn btn-primary\'>button</button>',someXSS: '<script>alert("all your credit cards belong to me!!");</script>'},},
Sails提供了exposeLocalsToBrowser来将ViewModel中的属性暴露给浏览器:
<%- exposeLocalsToBrowser({keys:['someRawHTML', 'someXSS']}) %>
<div><h1>Welcome <%= user.username %></h1><div><%- someRawHTML %></div><div><%- someXSS %></div>
</div>
<script type="text/javascript">console.log(window.SAILS_LOCALS.someRawHTML);console.log(window.SAILS_LOCALS.someXSS);
</script>
ViewModel中包含html和js脚本意味着可能会发生被XSS攻击的风险,因此,我们可以将模板进行以下修改:
<%- exposeLocalsToBrowser({keys:['someRawHTML', 'someXSS'], dontUnescapeOnClient: true}) %>
<div><h1>Welcome <%= user.username %></h1><div id="someRawHTML"></div><div id="someXSS"></div>
</div>
<script type="text/javascript">document.querySelector("#someRawHTML").innerHTML = window.SAILS_LOCALS.someRawHTML;document.querySelector("#someXSS").innerHTML = window.SAILS_LOCALS.someXSS;
</script>
于是,我们就避免了XSS攻击的风险。
Layouts
Sails为内置的ejs引擎提供了便捷的指定layout的方式,可以在route时在locals中设置layout属性来指定使用的layout,如:
'get /privacy': {view: 'users/privacy',locals: {layout: 'users'}},
这部分可以参考之前的使用案例。
Partials
Sails为内置的ejs引擎提供了便捷的模板代码复用方式partials,核心语法是:
<%- partial(relPathToPartial, optionalOverrides) %>
我们在views下新建partials目录,并创建navbar.ejs:
<nav class="navbar navbar-expand-lg navbar-light bg-light"><a class="navbar-brand" href="#">Navbar</a><button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText"aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button><div class="collapse navbar-collapse" id="navbarText"><ul class="navbar-nav mr-auto"><li class="nav-item active"><a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a></li><li class="nav-item"><a class="nav-link" href="#">Features</a></li><li class="nav-item"><a class="nav-link" href="#">Pricing</a></li></ul><span class="navbar-text"><%= username %></span></div>
</nav>
修改locals.ejs:
<%- partial ('../partials/navbar.ejs', { username: user.username }) %>
<div><h1>Welcome <%= user.username %></h1>
</div>
于是我们就完成了两个部分ejs模板的合并。
Sails基础之View层相关推荐
- Java中dao层、service层、controller层、entity层和view层的概述
目录 DAO层:(持久层)主要与数据库进行交互 Service层:(业务层 )控制业务 Controler层:(控制层 )控制业务逻辑 Entity层: (实体层 )数据库在项目中的类 View层: ...
- 用Gradle打包出jar文件 前面我们说过,在Android Studio里面使用Gradle来打包应用程序,一般都是build出来一个apk文件。但是有的同学是做实现层的开发,不直接做View层
用Gradle打包出jar文件 前面我们说过,在Android Studio里面使用Gradle来打包应用程序,一般都是build出来一个apk文件.但是有的同学是做实现层的开发,不直接做View层的 ...
- iOS 应用架构谈:view 层的组织和调用方案
iOS 应用架构谈:view 层的组织和调用方案 iOS应用架构谈 开篇 iOS应用架构谈 view层的组织和调用方案 iOS应用架构谈 网络层设计方案 iOS应用架构谈 动态部署方案 iOS应用架构 ...
- iOS应用架构谈(三):View层的组织和调用方案(下)
本门心法 重剑无锋,大巧不工. ---- <神雕侠侣> 这是杨过在挑剑时,玄铁重剑旁边写的一段话.对此我深表认同.提到这段话的目的是想告诉大家,在具体做View层架构的设计时,不需要拘泥于 ...
- iOS应用架构谈 view层的组织和调用方案
iOS应用架构谈 开篇 iOS应用架构谈 view层的组织和调用方案 iOS应用架构谈 网络层设计方案 iOS应用架构谈 本地持久化方案及动态部署 iOS应用架构谈 组件化方案 前言 < ...
- iOS应用架构谈(2) view层的组织和调用方案
当我们开始设计View层的架构时,往往是这个App还没有开始开发,或者这个App已经发过几个版本了,然后此时需要做非常彻底的重构. 一般也就是这两种时机会去做View层架构,基于这个时机的特殊性,我们 ...
- 二,iOS应用架构谈 view层的组织和调用方案
前言 <iOS应用架构谈 开篇>出来之后,很多人来催我赶紧出第二篇.这一篇文章出得相当艰难,因为公司里的破事儿特别多,我自己又有点私事儿,以至于能用来写博客的时间不够充分. 现在好啦,第二 ...
- iOS view层的组织和调用
前言 <iOS应用架构谈 开篇>出来之后,很多人来催我赶紧出第二篇.这一篇文章出得相当艰难,因为公司里的破事儿特别多,我自己又有点私事儿,以至于能用来写博客的时间不够充分. 现在好啦,第二 ...
- iOS开发笔记--iOS应用架构谈 view层的组织和调用方案
前言 <iOS应用架构谈 开篇>出来之后,很多人来催我赶紧出第二篇.这一篇文章出得相当艰难,因为公司里的破事儿特别多,我自己又有点私事儿,以至于能用来写博客的时间不够充分. 现在好啦,第二 ...
- (转)iOS应用架构谈 view层的组织和调用方案
前言 接着上一篇转载,今天突然发现作者补全了,正好有空全部整理过来. 原文链接:http://casatwy.com/iosying-yong-jia-gou-tan-viewceng-de-zu-z ...
最新文章
- 检测、量化、追踪新冠病毒,基于深度学习的自动CT图像分析有多靠谱?
- django 不用自带的mysql_python笔记二 django自带后台管理系统、模版渲染以及使用mysql数据库...
- HDU - 4035 Maze(概率dp)
- JDK1.8 之Stream API总结
- Good Bye 2017 G. New Year and Original Order 数位dp + 按数贡献
- Win7旗舰版系统如何设置定时关机
- HTML 表单和输入
- java设置只有一行表格,为什么我的表格插入一行后 样式都变了?是因为没有设置css吗?如果在java函数中插入的td.innerHTML = input type='text'/,可以设置样...
- 华为机试HJ21:简单密码
- 4.2 react patterns(转)
- 【PRML 学习笔记】附录 - 变分法 (Calculus of Variations)
- 微信小游戏代码包侵权(最新)
- Validation参数校验注解
- 双电机智能小车装配教程(海灵智电)
- Oracle sql语句整理合集
- 物流快递电子面单Api接口怎么申请对接(顺丰、快递鸟、菜鸟、拼多多)
- keras+theano安装教程
- hexo博客kaze主题自定义社交链接
- Vibosoft PDF Locker(PDF加密工具)v2.2.7官方版
- Elasticsearch插件安装之cerebro(八)
热门文章
- GPU与CPU的区别
- .net core增强工作流组件,基于稳定平台,多项目整合开发
- win10系统qq截图时屏幕局部自动放大怎么办 解决方法
- ZZULIOJ 1014: 求三角形的面积
- ios7 未能连接到服务器,完美解决iTunes 未能连接到此 iPhone。发生未知错误(0xe8000003)和0xe8000084...
- 使用apache的ftpserver搭建ftp服务器
- 【SYS/BIOS】4.2节同步模块之事件模块
- GIS-空间分析(4)
- 开发Android系统应用
- 南京信息工程大学 第二届程序设计大赛团队赛 试题