我在Meteor中定义了一个模板助手,比如说
Template.postsList.helpers({
filteredPosts: function getPosts() {
return Posts.find(...);
}
});
如何从控制台调试该模板助手,如何从应用程序中的其他代码重用它?
答案 0 :(得分:6)
想要从应用程序的其他位置调用帮助程序,建议您将其分解为函数。
要快速调试帮助程序,请在客户端控制台中对此进行评估:
Template.postsList.__helpers.get('filteredPosts')(...parameters);
有一个软件包可能有助于调试模板和模板助手:prasad19sara:client-debugger。
答案 1 :(得分:3)
它没有正式回答这个问题,但我想分享一个简单的技术,它实际上解决了你所描述的大多数问题。
我们假设我们有一组帮助程序,我们希望能够从模板和直接从我们的javascript代码访问应用程序的不同部分。为了实现这一目标,我将拥有一个全局Helpers
对象,我可以根据需要附加尽可能多的函数,例如。
Helpers.routeIs = function (name) {
var current = Router.current();
return current && current.route && current.route.getName() === name;
};
Helpers.year = function () {
return moment().year();
};
这使得它们可以在整个代码中轻松访问,并且非常容易测试。但我也想在我的Spacebars模板中使用它们,对吗?
一个简单的想法是创建一个单独的全局帮助器,它将返回Helpers
对象本身。
Template.registerHelper('$', function () {
return Helpers;
});
关于这一点的好处是,它会强制我为每个对我的"全球助手"的引用添加前缀。使用$
,即{{$.year}}
或{{$.routeIs 'home'}}
,这使代码更具可读性。
不幸的是,该解决方案存在一个小问题。请考虑以下示例:
Helpers.fullName = function () {
return this.firstName + ' ' + this.lastName;
};
问题是,如果我的助手要通过this
访问当前上下文,它将获取Helpers
对象本身而不是数据上下文,因此{{$.fullName}}
永远不会好好工作。但当然,有一个解决方法:
Template.registerHelper('$', function () {
return new Proxy(this);
});
function Proxy (context) {
this.context = context;
}
// put this in a place when you're quite sure
// all the helpers are already defined
_.each(Helpers, function (helper, name) {
Proxy.prototype[name] = function () {
return helper.apply(this.context, arguments);
};
});
我在这里添加了一个参考实现: