非反应助手和模板#每次崩溃

非反应助手和模板#每次崩溃

问题描述:

这是关于包含动态查询的助手的问题,涉及反应变量和$ where操作符,当反应变量值更改时不会重新运行。然后关于如何解决它会导致一个奇怪的系统行为和崩溃。非反应助手和模板#每次崩溃

我在这,我们要显示的#each循环中发现插入文档的列表中选择模板:

<template name="todo"> 
    {{#each pendingMTs}} 
     <button class="showPendMT"> 
      <h4> - <strong> {{name}}</strong> </h4> 
     </button> 
    {{/each}} 
</template> 

在任务收集的文件的pendingMTs助手搜索与动态并以某种方式精心制作尤其是圆形,涉及使用其中运算符$ simplified-查询:

pendingMTs() { 
    return Tasks.find( 
     { $and: [ { owner: Meteor.userId() }, 
        { time: { $gt: 0 } },  
        { $where: function() 
{ return moment(this.createdAt).add((((this.timeuts == 'Days') ? 1 : ((this.timeuts=='Meses') ? 30 : 365)) * this.time), 'days').diff(moment([currYear.get(), currMonth.get()])) < 0; }} 
       ] 
     }); 
} 

参与搜索的两种反应瓦尔在创建模板的定义

Template.todo.onCreated(function() { 
    var year = moment().format("YYYY"); 
    var month = moment().format("M"); 
    month = month - 1; //to values from 0 to 11 

    currYear = new ReactiveVar(year); 
    currMonth = new ReactiveVar(month); 
}); 

然后在事件处理程序,我们在“选择”的变化修改反应瓦尔,例如为CURRMONTH:

'change #monthForecast' (event) { 
    event.preventDefault(); 
    const target = event.target; 
    currMonth.set(target.value); 
}, 

的第一个问题是,帮助不重新运行,尽管我们通过修改事件处理程序反应变量的值:为什么?

思考,这可能对事实反应瓦尔在哪里的功能,我为了添加一个简单的线条在助手的开始仅仅是为了创建辅助意识,为他们的$里面是由于:

var rerun = currYear.get(); rerun = currMonth.get(); 

现在肯定会让助手在任何时候重新运行任何2个反应变量。但不幸的是这导致了一个很奇怪的现象:

  • 如果无功增值经销商进行了修改,但并没有影响由辅助检索到的文件,系统精细运行,但:
  • 当修饰的反应瓦尔造成辅助检索一个多个文档超过文档数检索到的第一次,系统崩溃(因此新文件未在#each模板所示):

    Exception from Tracker recompute function: meteor.js:930:11 
    Error: Bad index in range.getMember: 3 
    

在查找原因时,我发现给出的错误索引号3在这种情况下总是等于第一次执行帮助程序时检索到的文档数。在这种情况下,修改其中一个无功变量的值后,系统崩溃时必须显示第4个文档。 我发现https://github.com/GroundMeteor/db/issues/184一些可能相关的问题

谁能指出如何涉及$其中具有反应瓦尔动态查询可以做,保持其自然的反应?

看起来你没有得到正确的反应变量。你不能只是调用myReactiveVar.get() - 他们(通常)连接到模板实例,以便您的代码应该是:

pendingMTs帮手,你const instance = Template.instance();访问实例,然后在你的$where功能你可以使用instance.currentMonth.get()instance.currentYear.get()

在活动现场,事件的第二个参数是模板实例,所以你会:

'change #monthForecast' (event, templateInstance) { 
    event.preventDefault(); 
    const target = event.target; 
    templateInstance.currMonth.set(target.value); 
}, 

这样你就不会太遥远!

https://docs.meteor.com/api/reactive-var.html

https://themeteorchef.com/tutorials/reactive-dict-reactive-vars-and-session-variables

+0

若碧,非常感谢您的回答。我可以通过在$ where:操作符中使用Reactive vars来解决这个问题,方法是在模板助手var timeRef = diff(moment([currYear.get(),currMonth.get()]) ),然后使用$ where中的变量:.通过这种方式,只要有任何反应性变化发生变化,就会重新评估助手。 – francis

+0

在您指出Rubie的链接中,据说“ReactiveVars没有全局名称,而是可以在本地创建和使用它们,例如附加到模板实例”,还说“ReactiveVar更适合本地数据,特别是在模板级别“,但是我找不到一个地方说它强制将它们附加到本地模板实例。我的解决方案证实它至少不是必需的,但是如果按照您的建议在本地连接时它们的工作通常会更好(我将检查它),那么最好在文档中指出它。 – francis

+0

不知道我是否100%关注,但如果您想存储全局可用且可用的内容,则可以使用Session。我只是剔除它,但我认为这个线程可能是有趣的:http://*.com/questions/31580261/meteor-using-sessions-and-reactivevar。这有帮助吗? – rubie