node的模板:Handlebars

  (1)①如果上下文对象是:{ name: ‘Buttercup‘ },

     模板是<p>Hello, {{name}}!</p>

    将输出Hello,Buttercup!

    ②如果上下文对象是:{ name: ‘<b>Buttercup</b>‘ },要想输出不转义的变量,需要这么写:<p>Hello, {{{name}}}!</p>

     三个{}保证html标签被解析

    ③注释:{{! super-secret comment }}

        <!-- not-so-secret comment -->

     假如这是一个服务器模板,第一个注释将不会被传递到浏览器

  (2)块级表达式:

  

{
  currency: {
                   name: ‘United States dollars‘,
                   abbrev: ‘USD‘,
  },   tours: [
                { name: ‘Hood River‘, price: ‘$99.95‘ },
                { name: ‘Oregon Coast‘, price, ‘$159.95‘ },
         ],
  specialsUrl: ‘/january-specials‘,
  currencies: [ ‘USD‘, ‘GBP‘, ‘BTC‘ ],
}
//使用 ../ 来访问上一级上下文 ,if块会产生一个新的上下文,因此如果在each块中使用if,需要注意上下文问题
<ul>
??    {{#each tours}}
    <li>
        {{name}} - {{price}}
        {{#if ../currencies}}
            ({{../../currency.abbrev}})
        {{/if}}
    </li>
    {{/each}}
</ul>    

{{#unless currencies}}
    <p>All prices in {{currency.name}}.</p>
{{/unless}}

{{#if specialsUrl}}
    <p>Check out our <a href="{{specialsUrl}}">specials!</p> {{else}}
    <p>Please check back often for specials.</p>
{{/if}}

<p>
    {{#each currencies}}
        <a href="#" class="currency">{{.}}</a>
    {{else}}
        Unfortunately, we currently only accept {{currency.name}}.
    {{/each}}
</p>    

在 if 和 each 块中都有一个可选的 else 块(对于 each,如果数组中没有任何元素,else 块就会执行)。我们也用到了 unless 辅助方法,它基本上和 if 辅助方法是相反的:只有在 参数为 false 时,它才会执行。

(3)在express中使用/不使用布局:布局文件在express的views/loyouts目录下

  var handlebars = require(‘express3-handlebars‘) .create({ defaultLayout: ‘main‘ }); //默认该js下的页面视图使用此布局

  app.get(‘/foo‘, function(req, res){

    res.render(‘foo‘);

  });

//如果你根本不想使用布局(这意味着在 视图中你不得不拥有所有的样板文件),可以在上下文中指定 layout: null:
app.get(‘/foo‘, function(req, res)
    { res.render(‘foo‘, { layout: null });
});

//或者,如果你想使用一个不同的模板,可以指定模板名称:这样就会使用布局 views/layouts/microsite.handlebars 来渲染视图了。
app.get(‘/foo‘, function(req, res){
    res.render(‘foo‘, { layout: ‘microsite‘ });
});

(4)局部组件:如果在网站中有一部分组件<div>等需要在不同的页面复用,需要单独拿出来作为局部组件,在express架构下默认目录views/partials/

  创建weather.handlebars文件:

<div class="weatherWidget">
    {{#each partials.weather.locations}} <div class="location">
        <h3>{{name}}</h3>
        <a href="{{forecastUrl}}">
        </a> </div>
        <img src="{{iconUrl}}" alt="{{weather}}">
        {{weather}}, {{temp}}
        ?
    {{/each}}
    <small>Source: <a href="http://www.wunderground.com">Weather
        Underground</a></small>
</div>

在主程序js文件中模拟假数据:

//获取天气信息函数,模拟数据
function getWeatherData(){
    return {
        locations: [
            {
                name: ‘Portland‘,
                forecastUrl: ‘http://www.wunderground.com/US/OR/Portland.html‘,
                iconUrl: ‘http://icons-ak.wxug.com/i/c/k/cloudy.gif‘,
                weather: ‘Overcast‘,
                temp: ‘54.1 F (12.3 C)‘,
            },
            {
                name: ‘Bend‘,
                forecastUrl: ‘http://www.wunderground.com/US/OR/Bend.html‘,
                iconUrl: ‘http://icons-ak.wxug.com/i/c/k/partlycloudy.gif‘,
                weather: ‘Partly Cloudy‘,
                temp: ‘55.0 F (12.8 C)‘,
            },
            {
                name: ‘Manzanita‘,
                forecastUrl: ‘http://www.wunderground.com/US/OR/Manzanita.html‘,
                iconUrl: ‘http://icons-ak.wxug.com/i/c/k/rain.gif‘,
                weather: ‘Light Rain‘,
                temp: ‘55.0 F (12.8 C)‘,
            },
        ],
    }
}

然后创建一个中间件给 res.locals.partials 对象添加这些数据

app.use(function(req, res, next){
    if(!res.locals.partials) res.locals.partials = {};
    res.locals.partials.weather = getWeatherData();
    next();
});

结束后,例如我们将组件放在main.handlwbars里面:

{{> weather}}

语法{{> partial_name}}可以让你在视图中包含一个局部文件。express3-handlebars会 在 views/partials 中寻找一个叫作 partial_name.handle-bars 的视图

组件可以放在views/partials/...目录下

时间: 2024-08-22 12:53:35

node的模板:Handlebars的相关文章

node.js 模板 ejs 转

node.js 模板引ejs. 搜了一把推荐用ejs的最多. 速度比对:http://www.cnblogs.com/fengmk2/archive/2011/04/28/2031971.html ejs速度不是最快的,推荐最多大概是因为其简单的语法结构.主要通过<% %><%=%>来嵌套代码.比如符合阅读逻辑,同时也省去不少学习语法的成本. 另有一些自定义的方法:如link_to(name, url),img_tag(url)等. 还可以支持json. =========== e

Node.js模板引擎的深入探讨

每次当我想用 node.js 来写一个 web 相关项目的时候,我总是会陷入无比的纠结,原因是 JavaScript 生态圈里的模板引擎实在太多了,但那么多却实在找不出一个接近完美的,所谓完美的概念就是功能丰富,书写简单,前后端可共用等一些属性.虽然可以在 Template Chooser 按功能进行挑选,但挑选的结果再用来对比还是各有各的问题.所以干脆就一些模板引擎进行稍微深入的分析,希望通过对比总结出哪种更值得去使用. 第一轮排除 在上次node模板引擎简单比较的文章里,其实已经有个简单的筛

[js高手之路]Node.js模板引擎教程-jade速学与实战2-流程控制,转义与非转义

一.转义与非转义 jade模板文件代码: 1 doctype html 2 html 3 head 4 meta(charset='utf-8') 5 title jade学习-by ghostwu 6 body 7 h3 转义与非转义 8 - var userName = 'ghostwu' 9 - var str = '<script>alert("ghostwu");</script>' 10 div #{userName} 11 div #{str} 1

JS模板Handlebars的使用和有效组织

应用背景 我们在做项目时,为了使页面模块高度复用,使用页面模板是必须的,我想大家通常可能会新建MVC的项目,然后在页面中使用Razor引擎,新建Helper模板类,前后台代码的混写,简洁高效,一切都是那么的行云流水,我就是这么干的! 直到有一天,当我快做完一个项目时,经理对我说,你不要直接访问数据库,用接口就行了,是啊,说的多轻松,但对程序员来说这就是晴天霹雳啊,因为这意味着你这个项目的流程彻底改变.  变成 初看起来好像没什么大的问题,砍掉整个后台好像还方便了不少,但还是有些问题,因为接口返回

Node.js模板引擎学习----ejs

环境:windows+node.js+express 一.安装ejs 打开cmd窗口,输入npm install ejs -g,等待下载安装完成. 二.使用 调用过程中使用路由机制和模板,路由请求地址为根目录,模板文件为home.ejs[注:模板引擎文件为.ejs文件] 1.新建js文件为index.js 写入如下代码: varexpress=require("express"); varapp=express(); //设置渲染引擎 app.set("viewengine&

node引入模板

大家请看一下四种node引入方式,能看出些什么呢? 大家都知道npm模板有很多很多种具体大家可登陆npm官网查询,我们可以打开cmd小黑板自行下载所需要的模板,下载下来的模板会自行存入一个node_modules的文件夹中,需要调用时直接声明一个变量=require("包名字")如上面第二个. 当然除了引用官方模板包我们自己也可以写一些自己的模板不过引用时写的是相对路径,如上面第三个.大家可能会觉得相对路径好麻烦又要./又要写后缀,象官方包那样只写个名字多方便,当然可以!这时我们就需要

[js高手之路]Node.js模板引擎教程-jade速学与实战1

环境准备: 全局安装jade: npm install jade -g 初始化项目package.json: npm init --yes 安装完成之后,可以使用 jade --help 查看jade的命令行用法 一.在项目目录下新建index.jade文件 inde.jade代码: 1 doctype html 2 html 3 head 4 meta(charset='utf-8') 5 title 6 body 7 h3 欢迎学习jade 语法规则: 1, 标签按照html的缩进格式写 2

[js高手之路]Node.js模板引擎教程-jade速学与实战4-模板引用,继承,插件使用

一.block 模块复用 把需要复用的模块用block定义 block后面跟上模块的名字,引用一次block 内容就会被复用一次 编译之后的结果: 二,继承模板(extends) 在实际开发中,网站的头部,尾部一般都是公用的,我们可以通过jade的模板继承( extends ) 功能,把公共部分抽象出来,然后让不同的页面继承这些公共部分, 而且继承过来之后还可以重写 新建一个layout.jade模板 这是一个公共的模板,如果我们的首页需要这个公共模板,同时首页需要修改这个公共模板的布局部分(

理解node的模板引擎

1.1.3:分析模板引擎    1.什么是模板引擎 模板引擎是一个将页面模板和要显示的数据结合生成HTML页面的工具 可以这么理解,如果说Express中的路由控制方法是MVC中的控制器的话,那么模板就是MVC的视图. 什么是ejs? ejs是模板引擎的一种,也是在1.1.2节中用到的模板引擎,因为它使用起来非常简单,而且与express集成良好. 2.使用模板引擎 我在之前讲过通过以下两行代码设置模板文件的存储位置和使用的模板引擎: app.set('views', path.join(__d