2016-12-04 4 views
0

Я ищу способ получить старую ценность реактивного источника данных в Метеор. Скажем, у меня есть этот код:Как получить старую ценность реактивного источника данных в Метеор?

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