我想要达到的目标
服务器是一个 Node.js 应用程序。我想与客户端共享代码作为 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
那么,我应该如何使用(客户端)Jadecompile()
函数中的本地选项来在服务器和客户端之间共享代码?
更新
更新 1:根据@explunit 评论,将属性重命名moment
为localmoment
(inside options.locals
),给我一个错误undefined is not a function with the template p= localmoment().format()
。我不明白为什么...
更新 2:@Isaac Suttell 提出的解决方案(表达式函数而不是匿名函数)不起作用,我在p= foo()
.