如何获取流星中反应性数据源的旧值?

问题描述:

我正在寻找一种方法来获取Meteor中的反应性数据源的旧值。说我有这样的代码:如何获取流星中反应性数据源的旧值?

const foo = new ReactiveVar(1); 

Tracker.autorun(() => { 
    const fooNewVal = foo.get(); 

    if (/* compare based on fooNewVal value */) { 
    // do something 
    } 
}); 

foo.set(2); 
foo.set(3); 
foo.set(4); 

我想以某种方式获得的foo旧值,使用旧值与新值来决定,如果语句的执行,如:

const foo = new ReactiveVar(1); 

Tracker.autorun(() => { 
    const fooNewVal = foo.get(); 
    const fooOldVal = foo.getOld(); 

    if (fooNewVal - fooOldVal === 1) { 
    // do something 
    } 

    if (fooNewVal - fooOldVal === 2) { 
    // do something 
    } 

}); 

foo.set(2); 
foo.set(3); 

我知道我可以在autorun函数的末尾使用一个正常的变量来存储旧值:

const foo = new ReactiveVar(1); 
let oldValue = 1; 

Tracker.autorun(() => { 
    const fooNewVal = foo.get(); 

    if (fooNewVal - oldValue === 1) { 
    // do something 
    } 

    if (fooNewVal - oldValue === 2) { 
    // do something 
    } 

    oldValue = fooNewVal; 
}); 

foo.set(2); 
foo.set(3); 

虽然它的工作原理,它不看“右”对我来说。我搜索了Atmosphere和Npm,但找不到解决方案。你知道任何解决方案或包/模块来解决这个问题吗?

你在做什么很好。存储先前版本的变量是一种常见的做法。如果您从数据库中获取数据,自动运行功能开始处的数据仍旧是旧值。自动运行会在被动变量发生变化时触发,因此在您的情况下,foo在输入时已经改变。

+0

我知道我可以这样做,事实上我一直在这样做。但它对我来说并不觉得“正确”,根本看不到“漂亮”。我更喜欢更直观的方式,比如'foo.getOld()'。我没有这个用于集合的'.getOld'(事实上从来不需要它),但对于'ReactiveVar''',ReactiveDict'它真的使我使用缓存变量困扰。无论如何感谢您的回答:) – Khang