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

时间:2016-02-11 19:38:44

标签: 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")
}

此代码失败,因为即使仅foo changed更改,控制台也会打印其中一条bar条消息。

在我的foo中同时使用bar Tracker.autorun(),而bar无法运行bar更改,我想通过告诉'Tracker'不跟踪Tracker或者通过询问Session什么引发重新计算,而不是将功能分成不同的自动运行功能或通过手动保持来实现标签cancel变量已更改。

3 个答案:

答案 0 :(得分:2)

这种做法怎么样?

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

答案 1 :(得分:-1)

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

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
}

答案 2 :(得分:-1)

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