据说使用太多的Sessions是不好的,因为它“污染了全局名称空间”。现在,我不完全清楚这意味着什么(我可以轻松想到要使用的更多名称...),但是我已经开始使用ReactiveVar了,但它似乎很复杂且有错误,因此我想知道这样做的好处是什么是。

例如,这个简单的用例抛出一个错误:

Template.AddingItem.onRendered(function() {
    this.addingItem = new ReactiveVar(false)
})

Template.AddingItem.events({

    'click .add-new-item.button': function(event, template) {
        var addingItem = template.addingItem.get()
        if (addingItem === false) {
            template.addingItem.set(true)
        }
        else {
            template.addingItem.set(false)
        }
     }
})

Template.AddingItem.helpers({

    isAddingItem: function() {
        return Template.instance().addingItem.get()
    },
 })


模板:

{{#if isAddingItem}}
    <div>Showing something</div>
{{/if}}


有时,帮助程序会在onRendered之前运行,并且无法返回任何内容,因此该页面会出错。从字面上看,这是ReactiveVar最简单的用例,它甚至不能做到这一点?我想念什么?

最佳答案

使用Template.onCreated创建reactiveVars

您必须在运行任何控制器代码之前实例化reactVar,以便Tracker可以正确跟踪您的reactiveVar。正如您所遇到的那样,onRendered最适合用于操作DOM且运行太晚以至于无法可靠地确保在帮助程序运行时addingItem存在的功能。

这就是onCreated的最佳选择。这样,当您的助手/控制器代码运行时,确保您的reactVar存在。

Template.AddingItem.onCreated(function() {
  this.addingItem = new ReactiveVar(false)
})


为了将来参考,Sessions实际上只是具有全局作用域的reactiveVars……它们没有什么神奇之处。一直到reactiveVars

关于javascript - 如何保持reactVars模板的作用域?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34519364/

10-08 21:01