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层相关推荐

  1. Java中dao层、service层、controller层、entity层和view层的概述

    目录 DAO层:(持久层)主要与数据库进行交互 Service层:(业务层 )控制业务 Controler层:(控制层 )控制业务逻辑 Entity层: (实体层 )数据库在项目中的类 View层: ...

  2. 用Gradle打包出jar文件 前面我们说过,在Android Studio里面使用Gradle来打包应用程序,一般都是build出来一个apk文件。但是有的同学是做实现层的开发,不直接做View层

    用Gradle打包出jar文件 前面我们说过,在Android Studio里面使用Gradle来打包应用程序,一般都是build出来一个apk文件.但是有的同学是做实现层的开发,不直接做View层的 ...

  3. iOS 应用架构谈:view 层的组织和调用方案

    iOS 应用架构谈:view 层的组织和调用方案 iOS应用架构谈 开篇 iOS应用架构谈 view层的组织和调用方案 iOS应用架构谈 网络层设计方案 iOS应用架构谈 动态部署方案 iOS应用架构 ...

  4. iOS应用架构谈(三):View层的组织和调用方案(下)

    本门心法 重剑无锋,大巧不工. ---- <神雕侠侣> 这是杨过在挑剑时,玄铁重剑旁边写的一段话.对此我深表认同.提到这段话的目的是想告诉大家,在具体做View层架构的设计时,不需要拘泥于 ...

  5. iOS应用架构谈 view层的组织和调用方案

    iOS应用架构谈 开篇  iOS应用架构谈 view层的组织和调用方案  iOS应用架构谈 网络层设计方案  iOS应用架构谈 本地持久化方案及动态部署  iOS应用架构谈 组件化方案 前言 < ...

  6. iOS应用架构谈(2) view层的组织和调用方案

    当我们开始设计View层的架构时,往往是这个App还没有开始开发,或者这个App已经发过几个版本了,然后此时需要做非常彻底的重构. 一般也就是这两种时机会去做View层架构,基于这个时机的特殊性,我们 ...

  7. 二,iOS应用架构谈 view层的组织和调用方案

    前言 <iOS应用架构谈 开篇>出来之后,很多人来催我赶紧出第二篇.这一篇文章出得相当艰难,因为公司里的破事儿特别多,我自己又有点私事儿,以至于能用来写博客的时间不够充分. 现在好啦,第二 ...

  8. iOS view层的组织和调用

    前言 <iOS应用架构谈 开篇>出来之后,很多人来催我赶紧出第二篇.这一篇文章出得相当艰难,因为公司里的破事儿特别多,我自己又有点私事儿,以至于能用来写博客的时间不够充分. 现在好啦,第二 ...

  9. iOS开发笔记--iOS应用架构谈 view层的组织和调用方案

    前言 <iOS应用架构谈 开篇>出来之后,很多人来催我赶紧出第二篇.这一篇文章出得相当艰难,因为公司里的破事儿特别多,我自己又有点私事儿,以至于能用来写博客的时间不够充分. 现在好啦,第二 ...

  10. (转)iOS应用架构谈 view层的组织和调用方案

    前言 接着上一篇转载,今天突然发现作者补全了,正好有空全部整理过来. 原文链接:http://casatwy.com/iosying-yong-jia-gou-tan-viewceng-de-zu-z ...

最新文章

  1. 检测、量化、追踪新冠病毒,基于深度学习的自动CT图像分析有多靠谱?
  2. django 不用自带的mysql_python笔记二 django自带后台管理系统、模版渲染以及使用mysql数据库...
  3. HDU - 4035 Maze(概率dp)
  4. JDK1.8 之Stream API总结
  5. Good Bye 2017 G. New Year and Original Order 数位dp + 按数贡献
  6. Win7旗舰版系统如何设置定时关机
  7. HTML 表单和输入
  8. java设置只有一行表格,为什么我的表格插入一行后 样式都变了?是因为没有设置css吗?如果在java函数中插入的td.innerHTML = input type='text'/,可以设置样...
  9. 华为机试HJ21:简单密码
  10. 4.2 react patterns(转)
  11. 【PRML 学习笔记】附录 - 变分法 (Calculus of Variations)
  12. 微信小游戏代码包侵权(最新)
  13. Validation参数校验注解
  14. 双电机智能小车装配教程(海灵智电)
  15. Oracle sql语句整理合集
  16. 物流快递电子面单Api接口怎么申请对接(顺丰、快递鸟、菜鸟、拼多多)
  17. keras+theano安装教程
  18. hexo博客kaze主题自定义社交链接
  19. Vibosoft PDF Locker(PDF加密工具)v2.2.7官方版
  20. Elasticsearch插件安装之cerebro(八)

热门文章

  1. GPU与CPU的区别
  2. .net core增强工作流组件,基于稳定平台,多项目整合开发
  3. win10系统qq截图时屏幕局部自动放大怎么办 解决方法
  4. ZZULIOJ 1014: 求三角形的面积
  5. ios7 未能连接到服务器,完美解决iTunes 未能连接到此 iPhone。发生未知错误(0xe8000003)和0xe8000084...
  6. 使用apache的ftpserver搭建ftp服务器
  7. 【SYS/BIOS】4.2节同步模块之事件模块
  8. GIS-空间分析(4)
  9. 开发Android系统应用
  10. 南京信息工程大学 第二届程序设计大赛团队赛 试题