-1

我正在使用流星 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”作为窗口调用的函数。

4

4 回答 4

0

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

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

当您在助手中使用它时,这就是数据上下文。

于 2013-06-26T16:56:38.307 回答
0

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

Template.task.helpers({
...
    'time_left': function(){
        debugger;
        var nDate = this.due_date.getTime();
...
于 2013-06-27T10:15:37.787 回答
0

当使用三个 Meteor 模板回调函数中的任何一个时,包括该onRendered函数,该this对象实际上是一个模板实例对象。虽然可以通过该对象获取模板的数据上下文,但还是建议您通过Template.currentData()函数的使用来引用模板数据上下文。这个函数的文档可以在这里找到。

于 2015-05-10T11:13:40.553 回答
-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 
   }
}
于 2013-06-25T13:26:01.427 回答