【问题标题】:Can I specify what session variables a Tracker.autorun() function depends on?我可以指定 Tracker.autorun() 函数依赖的会话变量吗?
【发布时间】:2016-02-11 19:38:44
【问题描述】:

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

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是什么引发了重新计算,而不是将函数分成不同的自动运行函数,或者手动关注Session变量的变化。

【问题讨论】:

  • 您的自动运行应该在不相关的 Session 变量更改时运行,除非 foo 依赖于它(在这种情况下它实际上是相关的)。
  • 您可以简单地为每个依赖自变量的函数设置多个Tracker.autorun。但是,在您的示例中, foo 在您将其传递给函数时取决于 bar。
  • 你为什么这么说?多个跟踪器可能是一种非常强大和高效的模式。
  • ¬¬ 在开始赏金活动两秒钟后找到了答案,并说我在 互联网上的任何地方都找不到答案。请不要恨我。

标签: meteor meteor-tracker


【解决方案1】:

这种方法怎么样?

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。 哦,我明白了,您已经找到了解决方案。无论如何,我会在这里留下我的答案,也许有人会觉得它有用。

【讨论】:

  • 嗯。它确实绕过了自动跟踪器。 Tracker.nonreactive() 更好,但这绝对可以。
【解决方案2】:

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

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
}

【讨论】:

  • @yudap,在您的回答中限制使用foo 不会阻止自动运行按照您的建议运行:它只会在 foo 未定义的情况下阻止“foo”代码运行,如果它至少设置一次,这意味着它将始终在之后运行,因此您的代码确实对性能没有太大帮助!
  • 如果没有设置会话变量有什么用?最常见的情况是它被设置并且它改变了。不是设置或未设置。如果这是你的暗示,那么在你的解释中这么说。
  • 问题是我需要同时使用foo 和(在此示例中)bar 的值,但我不希望函数在bar 更改时运行。我想我可以添加另一个变量来跟踪它是否是 foo 改变的那个,但我宁愿告诉 Tracker 首先不要跟踪 bar
【解决方案3】:

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

【讨论】:

  • Deps 已在多年前因其新名称 Tracker 而被弃用。另外,如果您发现重复,则不应发布答案,而是标记您的帖子有重复。
  • 我更新了答案。但是,我不能让自己结束这个问题,因为即使答案是相同的,问题本身也不是(现在我的更新了)。我之前没有找到答案,因为我是从“排除对 Tracker 的依赖项”端而不是“防止 Session 创建依赖项”端进行搜索。我什至不知道我必须搜索“无效的上下文”才能得到答案。所以它不是重复的,让它保持开放是有好处的。而且我不明白为什么这个答案在有效并且回答问题时会遭到反对。
猜你喜欢
  • 2017-09-24
  • 2016-04-25
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
相关资源
最近更新 更多