我想要实现的目标
服务器是一个 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/