一个带有许多密钥的大型ReactiveVar或带有许多ReactiveVars的大哈希?

时间:2015-08-20 09:38:41

标签: meteor

例如,

var settingsA = new ReactiveVar({
  a: {
    b : true,
    c : 1
  },
  d: true,
})

var settingsB = {
  a: {
    b: new ReactiveVar(true),
    c: new ReactiveVar(1),
  },      
  d: new ReactiveVar(true),
}

哪一个更好?对于settingA,很难只更新一个字段。

最佳做法是什么。

1 个答案:

答案 0 :(得分:0)

在可能的情况下,第二个例子更好,因为它具有更细粒度的反应性。

使用第一个例子:

var auto1 = Tracker.autorun(function () {
    doSomethingWith(settingsA.get().a.b);
});

var auto2 = Tracker.autorun(function () {
    doSomethingElseWith(settingsA.get().d);
});

如果你这样做

var old = settingsA.get();
old.d = 5;
settingsA.set(old);

然后重新运行auto1auto2,即使auto1访问的数据未更改。

另一方面,使用第二个例子:

var auto1 = Tracker.autorun(function () {
    doSomethingWith(settingsB.a.b.get());
});

var auto2 = Tracker.autorun(function () {
    doSomethingElseWith(settingsB.d.get());
});

执行settingsB.d.set(5)只会导致auto2重新投放,而不会auto1

现在,如果动态插入和删除散列中的键,则可能无法进行第二种情况。在这种情况下,您应该考虑使用ReactiveDict