为什么流星模板onRendered函数中的'this'未定义?

时间:2013-06-25 12:08:13

标签: meteor this

我正在使用流星0.6.4。我遇到的问题是渲染模板时的数据上下文有时是未定义的,所以'this'对象是对Window的引用:

Template.task.time_left = function(){
    debugger;
    var nDate = this.due_date.getTime();

Exception from Deps recompute: TypeError: Cannot call method 'getTime' of undefined

html代码包含在{{each}}句柄语句中:

<template name="tasks_lists">
    {{#each tasks_list}}
    ...
        {{#each task}}
            {{> task}}
        {{/each}}
    ...
    {{/each}}
</template>
<template name="task">
...
    <div class="text">{{due_date}}</div>
...
</template>

我读到这个错误已经在早期版本的Meteor中解决了。我该怎样做才能避免使用'this'作为Window来调用函数。

3 个答案:

答案 0 :(得分:0)

您应该使用template.xxx.helpers,即:

Template.task.helpers({
  nDate: function() {
    return this.due_date.getTime();
  }
});

在帮助程序中使用它时,这是数据上下文。

答案 1 :(得分:0)

我使用'助手'功能,我有同样的问题。 'this'对象有时是窗口对象:

Template.task.helpers({
...
    'time_left': function(){
        debugger;
        var nDate = this.due_date.getTime();
...

答案 2 :(得分:-1)

模板助手中的this始终指向window对象。

您可以访问data中的Template.rendered()上下文或事件处理函数。在事件处理程序中,它作为第二个参数传递为function( event, template ),其中template是当前模板对象。

但是我建议您使用模板实例函数,例如find(), findAll(), firstNode(), lastNode()而不是数据上下文。

Template.task.rendered = function() {
   if( !this.window ){     //check that 'this' is not a 'window' object
      var el = this.find( 'div.text' );  // the div that holds due_date
      //do something 
   }
}