-
Notifications
You must be signed in to change notification settings - Fork 10
/
Tracker.js
40 lines (31 loc) · 1.25 KB
/
Tracker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// Also available as a global
import {Tracker} from 'meteor/tracker';
/**
* Create "one-time" reactive computations with Tracker
* @param name {string} Component Reactive Data Property for Computation
* @param context {*} Target Component Instance
* @param dataFunc {*} Data Context
* @param updateFunc {*} Component ForceUpdate Method - To re-trigger render function
* @returns {*} Symbol(react.element) - Result data-element composition
*/
Tracker.once = function (name, context, dataFunc, updateFunc) {
let data;
// Stop it just in case the autorun never re-ran
if (context[name] && !context[name].stopped) context[name].stop();
// NOTE: we may want to run this code in `setTimeout(func, 0)` so it doesn't impact the rendering phase at all
context[name] = Tracker.nonreactive(() => {
return Tracker.autorun(c => {
if (c.firstRun) {
data = dataFunc.call(context);
} else {
// Stop autorun here so rendering "phase" doesn't have extra work of also stopping autoruns; likely not too
// important though.
if (context[name]) context[name].stop();
// where `forceUpdate` will be called in above implementation
updateFunc.call(context);
}
});
});
return data;
};
export default Tracker