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

Meteor 我可以指定Tracker.autorun()函数所依赖的会话变量吗?,meteor,meteor-tracker,Meteor,Meteor Tracker,我目前有一段类似的代码: 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更改

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

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()
中同时使用
foo
bar
,每当
bar
发生变化时,它都不会运行,我想告诉“Tracker”不要跟踪
bar
,或者如果可能的话,询问
Tracker
是什么引起了重新计算,无需将函数拆分为不同的自动运行函数,也无需手动记录会话变量的变化。

您可以拆分自动运行函数:

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
}
事实证明

答案是使用
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.
哦,我明白了,你已经找到了解决办法。无论如何,我将把我的答案留在这里,也许有人会发现它很有用。

当不相关的会话变量发生变化时,自动运行不应该运行,除非foo依赖于它(在这种情况下,它实际上是相关的)。您只需为依赖于独立变量的每个函数设置多个Tracker.autorun。但是,在您的示例中,当您将其传递给函数时,foo依赖于bar。为什么这么说?多个追踪器可以是一种非常强大和有效的模式。在开始悬赏两秒钟后,我找到了答案,并说我在互联网上的任何地方都找不到答案。请不要恨我。@yudap,在您的回答中限制使用
foo
,并不会阻止自动运行,正如您所建议的那样:它只会阻止在foo未定义的情况下运行“foo”代码,如果foo未定义,则至少设置一次,意味着它将始终在后面运行,因此您的代码对性能没有多大作用!如果未设置会话变量,它有什么用途?最常见的情况是,它被设置并更改。并不是说它被设置或未设置。如果这是您的意思,那么请在您的解释中这样说。问题是我需要同时使用
foo
bar
的值(在本例中),但我不希望函数在
bar
更改时运行。我想我可以添加另一个变量来跟踪它是否是发生变化的
foo
,但我宁愿告诉Tracker不要跟踪
bar
,因为它的新名称
Tracker
,Deps多年前就被弃用了。另外,如果你发现了一个重复的答案,你不应该发布一个答案,而是标记你的帖子有一个重复的答案。我更新了答案。然而,我无法结束这个问题,因为即使答案是一样的,问题本身也不是(现在我的问题更新了)。我之前没有找到答案,因为我是从“排除跟踪程序上的依赖项”侧搜索的,而不是从“阻止会话创建依赖项”侧搜索的。我甚至不知道我必须搜索“无效上下文”才能得到答案。所以它不是一个复制品,让它打开是有好处的。我不明白为什么这个答案在起作用的时候会被否决,它回答了这个问题。它确实绕过了自动追踪器
Tracker.nonreactive()
更好,但这肯定会起作用。