如何在Meteor中渲染模板后创建模板助手?

时间:2014-06-03 11:17:09

标签: meteor

Template.prices.rendered = function() {

  OrderFormContent = new Meteor.Collection(null);

  var orderSubmission = function() {
    //code that inserts stuff into the OrderFormContent collection
    //the key **sqft** is assigned the value of **4000**   };

  orderSubmission();

};

Template.prices.helpers({ 
  sqft: function() {
    return OrderFormContent.findOne().sqft;   
  } 
});

上面的代码无法加载。 Meteor尝试创建{{sqft}}的帮助程序但不能,因为在页面呈现之后才会定义OrderFormContent。看来Meteor试图在页面呈现之前定义帮助器。

但我需要定义这个助手。我需要在渲染模板(未创建)之后定义它。

我不能在Template.prices.helpers内嵌套Template.prices.rendered

澄清:

如果我注释掉Template.prices.helpers代码,页面就会加载。如果我然后在控制台中手动运行OrderFormContent.findOne().sqft,则返回值4000。

当我取消评论Template.prices.helpers代码时,页面无法加载,我收到Exception from Deps recompute function: ReferenceError: OrderFormContent is not defined错误。

2 个答案:

答案 0 :(得分:1)

1)在函数内部定义全局变量是违反Javascript的良好实践,在严格模式下无效(因此将来当严格模式成为标准时将无效)。

2)您可以轻松实现目标,而无需在渲染后定义帮助程序。实际上,当帮助者创建但是当被调用时,不会抛出错误。要解决这个问题,只需要进行简单的检查即可。

var OrderFormContent = null;
var orderFormContentDep = new Deps.Dependency();

Template.prices.rendered = function() {
  OrderFormContent = new Meteor.Collection(null);
  ...
  orderFormContentDep.changed();
};

Template.prices.helpers({
  sqft: function() {
    orderFormContentDep.depend();
    if(!OrderFormContent) return null;
    var item = OrderFormContent.findOne();
    if(!item) return null;
    return item.sqft;
  });
});

答案 1 :(得分:0)

当我收到错误时,我将模板帮助器移动到客户端js,它就消失了。只有那些不适用于我的目的,因为它执行得太频繁了。所以,我把它放到一个铁路由器路由方法中进行渲染。