【问题标题】:How do you call a Meteor template helper from the console or other JS code?如何从控制台或其他 JS 代码调用 Meteor 模板助手?
【发布时间】:2015-11-09 15:32:06
【问题描述】:

我在 Meteor 中定义了一个模板助手,比如说

Template.postsList.helpers({
  filteredPosts: function getPosts() {
    return Posts.find(...);
  }
});

如何从控制台调试该模板助手,以及如何从应用程序的其他代码中重用它?

【问题讨论】:

标签: javascript meteor meteor-helper


【解决方案1】:
  1. 想要从应用程序的其他地方调用帮助程序,建议您将其分解到函数中。

  2. 要快速调试帮助程序,请在客户端控制台中进行评估:

    Template.postsList.__helpers.get('filteredPosts')(...parameters);
    
  3. 有一个包可以帮助调试模板和模板助手:prasad19sara:client-debugger

【讨论】:

  • 如何访问全局助手?
  • @Kostanos UI._globalHelpers.yourHelperName(...parameters) 调用 UI.registerHelper('yourHelperName', function () {})
【解决方案2】:

它没有正式回答这个问题,但我想分享一个简单的技术,它实际上解决了你描述的大部分问题。

假设我们有一组帮助程序,我们希望能够从应用程序的不同部分从模板和直接从我们的 javascript 代码访问它们。为了实现这一点,我将拥有一个全局 Helpers 对象,我可以将任意数量的函数附加到该对象上,例如

Helpers.routeIs = function (name) {
  var current = Router.current();
  return current && current.route && current.route.getName() === name;
};

Helpers.year = function () {
  return moment().year();
};

这使得它们可以在整个代码中轻松访问,并且也很容易测试。但我也想在我的空格键模板中使用它们,对吧?

一个简单的想法是创建一个将返回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);
  };
});

编辑

我在这里添加了一个参考实现:

https://github.com/anticoders/meteor-helpers

【讨论】:

猜你喜欢
  • 2016-05-26
  • 2015-01-29
  • 1970-01-01
  • 2014-11-27
  • 2013-02-18
  • 2015-09-14
  • 2015-03-28
  • 1970-01-01
  • 2015-01-06
相关资源
最近更新 更多