我可以指定 Tracker.autorun() 函数所依赖的会话变量吗?

Can I specify what session variables a Tracker.autorun() function depends on?

我目前有一段类似这样的代码:

Tracker.autorun(function() {
    var foo = Session.get("foo")
    var bar = Session.get("bar")
    if (bar)
      console.log("foo changed and bar is set")
    else
      console.log("foo changed and bar is not set")
}

此代码失败,因为即使只有 bar 发生变化,控制台也会打印 foo changed 条消息之一。

在我的Tracker.autorun()中同时使用foobar,没有它 运行 每当 bar 发生变化时,我想通过告诉“Tra​​cker”不要跟踪 bar 或者如果可能的话询问 Tracker 是什么引发了重新计算来做到这一点,而不是将函数分离为不同的自动运行 函数,或者通过手动跟踪 Session 变量发生了哪些变化。

您可以拆分自动运行功能:

Tracker.autorun(function() {
    var foo = Session.get("foo")
    // will run when foo changes
}


Tracker.autorun(function() {
    var bar = Session.get("bar")
    // will run when bar changes
}

事实证明,this question has already been answered before

答案是使用Tracker.nonreactive()。我的问题的固定代码是:

Tracker.autorun(function() {
    var foo = Session.get("foo")

    var bar = Tracker.nonreactive(func() {
        return Session.get("bar")
    })

    if (bar)
      console.log("foo changed and bar is set")
    else
      console.log("foo changed and bar is not set")
}

这种方法怎么样?

var foo;
var bar;

Tracker.autorun(function() {
    foo = Session.get("foo")
    bar = Session.get("bar")
});

Tracker.autorun(function() {
    // Track for changes of `foo`
    Session.get("foo");

    if (bar)
        console.log("foo changed and bar is set")
    else
        console.log("foo changed and bar is not set")
});

UPD. 哦,我明白了,你已经找到了解决办法。无论如何,我会在这里留下我的答案,也许有人会觉得它有用。