2016-12-04 61 views
0

我正在尋找一種方法來獲取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,但找不到解決方案。你知道任何解決方案或包/模塊來解決這個問題嗎?

回答

2

你在做什麼很好。存儲先前版本的變量是一種常見的做法。如果您從數據庫中獲取數據,自動運行功能開始處的數據仍舊是舊值。自動運行會在被動變量發生變化時觸發,因此在您的情況下,foo在輸入時已經改變。

+0

我知道我可以這樣做,事實上我一直在這樣做。但它對我來說並不覺得「正確」,根本看不到「漂亮」。我更喜歡更直觀的方式,比如'foo.getOld()'。我沒有這個用於集合的'.getOld'(事實上從來不需要它),但對於'ReactiveVar''',ReactiveDict'它真的使我使用緩存變量困擾。無論如何感謝您的回答:) – Khang