javascript - 如何在客户端的jadecompile()中使用 "locals"选项?

标签 javascript node.js browser requirejs pug

我想要实现的目标

服务器是一个 Node.js 应用程序。我想与客户端共享代码作为 Jade 模板助手(对于函数)或全局变量(对于对象/变量)。每个客户端模板中都应该提供新的帮助程序和全局变量。这个问题不是关于在服务器端使用 jade 时向 Jade 添加助手的问题。

代码

我为 Jade 编写了一个 RequireJS 包装器 compile()函数,传递locals options 内的对象(填充了要共享的属性) :

// ./wrappers/jade.js
define(['jade', 'moment', 'lodash'], function (Jade, moment, _) {
    return {
        compile: function (str, options) {
            options.locals = _.extend({
                moment: moment,                    // moment function
                bar: 'foo',                        // Custom bar variable
                foo: function () { return 'bar'; } // Custom foo function
            }, options.locals);

            return Jade.compile(str, options);
        }
    };
});

问题和怪异

当我尝试使用moment工作正常:

p!= moment().format() //- Works: <p>2013-07-10T13:57:12+02:00</p>

但是,访问自定义变量 bar给我没有错误,但有一个空 <p> :

p #{bar} //- No errors but: <p></p>

当我尝试调用自定义函数foo()时它给了我一个错误(“未定义不是一个函数”):

p= foo() //- Uncaught TypeError: undefined is not a function

那么,我应该如何使用(客户端)Jade compile() 中的本地选项函数,用于在服务器和客户端之间共享代码?

更新

更新 1:根据 @explunit 评论,重命名属性 moment进入localmoment (在 options.locals 内),使用模板 p= localmoment().format() 给我一个错误未定义不是一个函数 。我不明白为什么...

更新 2:@Isaac Suttell 提出的解决方案(表达式函数而不是匿名函数)不起作用,我遇到了与 p= foo() 相同的错误.

最佳答案

moment().format() 的调用仅有效,因为 moment 是一个全局变量,因此它根本不会被传递到您的模板中。

我知道将函数添加到模板中的唯一方法是通过模型本身。 可能有更好的方法,但我成功了。

define(['jade', 'moment', 'lodash'], function (Jade, moment, _) {
    return {
        compile: function (str, options) {
              var compileFunction = Jade.compile(str, options);
              return function(){
                  // augment the model with the functions/vars you need
                  arguments[0] = _.extend(arguments[0] || {}, {
                    foo: function() { return "bar"; },
                    bar: "foo"
                  });
                  return compileFunction.apply(null, arguments)
              }
        }
    };
});

然后如果你像这样定义你的模板

p #{bar}
p= foo() 

一切都应该运行良好。

关于javascript - 如何在客户端的jadecompile()中使用 "locals"选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17428984/

相关文章:

javascript - 仅运行一系列触发事件的最后一个事件

javascript - 我如何淡入和淡出并改进我当前的 JavaScript

node.js - ng 服务 --proxy-config proxyconfig.json 不起作用

javascript - 如何使用API​​获取谷歌地图查询结果?

javascript - 列出可用 JavaScript 事件的引用?

javascript - 对于 Javascript 中的嵌套对象,{} 是否比 [] 消耗更少的内存?

performance - 假设ID唯一,CSS快速配置文件可以更快?

JavaScript 非重定向

javascript - 实现编号方案,如 A,B,C ... AA,AB, ... AAA ...,类似于将数字转换为 radix26

node.js - findOne() 的 Mongoose(express、node、mongo)范围问题