• 构建帮助方法


    1、行内 Helper:最终只输出对应数据类型的Helper

     1 /*
     2 公共的Helper自然是写在公共模块下的app.js文件中,以hbs文件为例
     3 先得导入hbs库,也就是handlebars
     4 */
     5 const hbs = require('hbs');//导入hbs库,扩展handlebars
     6 
     7 //注册一个方法名称为 checkEven 的Helper,核实传过来的数据是否为偶数
     8 hbs.registerHelper("checkEven",(num)=>  {
     9     //去除取余数是否为0,偶数则为0,奇数则不为0
    10     if (num%2 ==0){
    11         return true;
    12     } else{
    13         return false;
    14     }
    15 });
    16 
    17 //对应模板引擎的调用 @index 为传入到该checkEven的helper方法的参数
    18 {{checkEven @index}}
    19 
    20 //也可以这样配置#if方法的使用
    21 {{#if (checkEven @index)}}
    22 {{/if}}

    helper传参的方式

     1 //helper的第一种传参
     2 {{testBiography index=@index name=name}}
     3 
     4 //接收方法
     5 hbs.registerHelper("testBiography", (data1, data2) => {
     6     return data1 + data2;
     7 })
     8 
     9 //helper的第二种接收方式
    10 hbs.registerHelper("testBiography", (options) => {
    11     const {index, name} = options.hash;//Es6中的解构赋值
    12     return index + name;
    13 })

    接收到的参数返回值处理

     1 //定义所传的参数为如下
     2 {{testBiography style="color:red" text="name" href="www.baidu.com"}}
     3 
     4 //接收helper方法要求返回的值为文本时
     5 hbs.registerHelper("testBiography", (options) => {
     6     const {style, text, href} = options.hash;
     7     return `<a style="${style}" href="${href}">${text}</a>`;
     8 })
     9 
    10 //接收helper方法要求返回的值为Html时
    11 hbs.registerHelper("testBiography", (options) => {
    12     const {style, text, href} = options.hash;
    13     return new hbs.SafeString(`<a style="${style}" href="${href}">${text}</a>`) ;
    14 })
    15 
    16 //接收的Helper方法中要求既有html,又包含有文本时,假设传递的text=“<span>name</span>”,而按照要求这都是属于文本,不应该作为html显示时
    17 hbs.registerHelper("testBiography", (options) => {
    18     const {style, text, href} = options.hash;
    19     return new hbs.SafeString(`<a style="${style}" href="${href}">${hbs.Utils.escapeExpression(text)}</a>`) ;
    20 })

    2、块级的Helper:最终输出的是html/JS/CSS的helper;

    对应的应用场景以项目中Jquery的引用为例,在正常情况下,按照之前的写法,我们直接在layout的公共界面上进行引用之后,在其他的界面可以直接进行应用。如下写法,在layout进行jquery文件的引用,在其它界面可以直接调用Jquery的类库进行JS的编写:

    当这样写完之后,会发现,页面出现了如下错误,在查看具体的错误时,会发现引用的Jquery文件跑到下面来了导致了加载的顺序倒了,所以没有识别到Jquery。

    按照此错误的第一处理办法,直接在index页面的<script> 块的上面进行jquery的再次引用,会发现该错误不存在了,但是会发现我们同时引入了两次jquery文件

    应对于此类场景,需要做如下的一个处理,引用块级的helper,直接将index页面的js文件搬到layout页面下的Jquery引用的代码块下面(即将JS块挪到指定的作用域下进行使用)。因此需要如下这样两个helper方法

     1 // 注册扩展代码块helper
     2 const blocks = {};//代码块缓存对象
     3 hbs.registerHelper('extend', function (name, context) {
     4     // context 是上下文,保存有用方法和数据,最后一个参数永远是context
     5     let block = blocks[name]; // block用来存放代码块
     6     if (!block) {
     7         block = blocks[name] = [];
     8     }
     9     // 变异指令中代码块并放入block
    10     block.push(context.fn(this));
    11     // 与context.fn()配对还有一个方法
    12     // context.inverse()
    13 })
    14 
    15 //该方法是将块级的JS、html、css等放在指定的位置
    16 hbs.registerHelper('block', function (name) {
    17     const val = (blocks[name] || []).join('
    ')
    18     blocks[name] = [];//清空缓存
    19     return val;
    20 })

    定义好上面的两个方法之后,在调用的时候,具体如下:

     1 //index界面上写的<script>标签需要包在 {{#extend}}的helper中
     2 {{#extend 'jquery'}}
     3     <script type="text/javascript">
     4         $(function () {
     5             $(".remark").click(function(){
     6                 alert("1111");
     7             });
     8         })
     9     </script>
    10 {{/extend}}
    11 
    12 //layout界面上的则需要进行指定这段js块代码的具体位置
    13 <script src="/javascripts/jquery.js"></script>
    14 {{{block 'jquery'}}}//指定js块

    更改完毕之后运行,即达到了我们想要的效果,对于css、html 的块移动同理

    3、引用N多的第三方帮助方法库https://github.com/helpers/handlebars-helpers

    在引用的时候,需要注意的,因为是属于第三方的帮助方法库,所以在自己的项目中引用需要做一步转换,之后就可以直接使用了

    const helpers = require('handlebars-helpers');//helpers库 
    helpers.comparison({handlebars: hbs.handlebars});
    目前只是自己在初学Express时,所做的一些总结,希望对于一些也在跟我一样刚学习的童鞋会有用,谢谢!
  • 相关阅读:
    C# 遍历类字段 及 字段值
    u8 采购到货单中的 业务类型 没有表字典,是系统预置 存入表也是文字: 普通采购 固定资产
    win7 X64 OLEDB读取EXCEL提示“未在本地计算机上注册 Microsoft.Jet.OLEDB.4.0 提供程序”
    关于 C# select 读取 Excel 数据 为空,或成科学计数法解决方案
    如何设置C#程序在Windows 7 Vista下以管理员权限运行
    C# OLE DB 的连接方式下 对 sql 参数的操作 需要改成 ? 号
    NHibernate (一) 五部曲
    做优秀产品经理
    Python Test in Hudson
    [转载]Openstack Essex安装文档资料
  • 原文地址:https://www.cnblogs.com/zixiwang/p/9959234.html
Copyright © 2020-2023  润新知