Meteor反应式var包缺少equals()方法,这是一个bug吗?

Meteor反应式var包缺少equals()方法,这是一个bug吗?,meteor,equals,Meteor,Equals,我正在学习Meteor中的反应式编程: 我相信,背后的想法是记住被动变量和期望值之间的关联,以便只有当等式发生变化时,更新才会传播到周围的代码。这样,如果我们有数百个依赖于变量的视图,只有旧视图和新视图在值更改时才会触发更新代码 请注意,如果调用Session.get(key)==value,则情况并非如此,因为变量更改时将调用每个视图的代码。这将在本文的Session.get与Session.equals()部分进一步讨论 但我发现使用反应性变量部分中有一个不一致的地方,它说: Notice

我正在学习Meteor中的反应式编程:

我相信,背后的想法是记住被动变量和期望值之间的关联,以便只有当等式发生变化时,更新才会传播到周围的代码。这样,如果我们有数百个依赖于变量的视图,只有旧视图和新视图在值更改时才会触发更新代码

请注意,如果调用
Session.get(key)==value
,则情况并非如此,因为变量更改时将调用每个视图的代码。这将在本文的Session.get与Session.equals()部分进一步讨论

但我发现使用反应性变量部分中有一个不一致的地方,它说:

Notice that a reactive variable, unlike the Session object, does not have an equals() method. Yes, that is a shame.
因此缺少
equals()
,但有

我真的看不出排除
ReactiveVar.equals()
的概念性原因。可能他们没有存储关联的上下文,或者可能Javascript存在一些作用域或其他问题,我不完全理解这些问题

所以我的问题是:这是一个bug吗?

我是否应该始终使用
反应式dict
?在这种情况下,我会改变一切,从:

let myReactiveVar = new ReactiveVar();
...
if(myReactiveVar.get() === 'myValue')
更详细(但性能更高):

这将与提供的功能相匹配

另一种选择是使用我自己的
equals()
方法扩展
ReactiveVar
原型,或者在子类中继承它,并提供一个
MyReactiveVar.equals()
方法。如果有人能提供一些例子来解决这些问题,我们可以将它们作为请求提交给Meteor维护人员,那就太好了

Update:我忘了提到ReactiveVar在其构造函数中采用了一个
equalsFunc
可选参数。可以将其作为一个反应性代码块,在不扩展类的情况下部分实现
equals()
功能。还有,这里有一个例子


更新:为节省时间,以下是和的相关源代码。我认为,
value
参数被转换为
serializedValue
,然后作为依赖项添加到
ReactiveDict
,但是我仍然不明白为什么不能对
ReactiveVar

执行类似的操作
ReactiveVar
没有
equals
方法的原因是
set
只会使计算无效,因为新值与当前值不同

设置ReactiveVar的当前值,如果newValue与旧值不同,则使调用get的计算无效

这与
ReactiveDict
equals
方法类似

请注意,在
ReactiveDict
上设置
。调用
set
广播值已更改。如果要防止计算无效,则应使用
equals

为ReactiveDict中的键设置一个值。通知所有侦听器该值已更改(例如:重画模板,并在此键上重新运行任何名为ReactiveDict.get的Tracker.autorun计算。)


虽然这是真的,但它仍然没有回答我最初提出的关于数百个视图的性能问题,这些视图在诸如
Session.equals(key,value)
之类的内容上侦听,因此只有旧视图和新视图在会话的值不再匹配所需值时才能调用更新。这可以通过
ReactiveDict.equals(key,value)
来实现,但不能通过
ReactiveVar
来实现,我还不认为有什么原因。非常感谢你的快速回复,还是一样的<代码>设置
仅在值更改时无效。如果无功var发生变化,任何比较都会发生变化。当无功var发生变化时,所有计算都必须重新运行。他们再也不能平等了。它与
.equals
相同,只是在不同的阶段使计算无效。我不确定这是真的。如果我们有
If(Session.equals('myVar',0))
If(Session.equals('myVar',1))
If(Session.equals('myVar',2))
,我们调用
Session.set('myVar',0)
然后
Session set('myVar',1)
,那么只会运行0和1个案例的代码。案例2的代码永远不会运行,因为myVar永远不等于2。而如果我们对其他数字使用
if(Session.get('myVar')==0)
等等,那么任何
Session.get('myVar')
的所有代码都将被调用,请看?@ZackMorris你说得对。在这里测试:嘿,谢谢你花时间来测试。如果我读对了,所有的
Tracker
最初都被调用。然后
console.log(“var-changed”,v.get())v
发生更改,就会调用code>。而
console.log(“运行a==1”);d、 equals('a',1)
仅在
d
0转换为1
1转换为2
时调用。它不适用于
2到3
及以上。
跟踪器
d.equals('a',2)
的工作原理类似,但适用于
2
let myReactiveDict = new ReactiveDict();
...
if(myReactiveDict.equals('myReactiveVar', 'myValue'))
const example = new ReactiveVar(0);

Tracker.autorun(() => {
  console.log(example.get());
});

example.set(1); // logs 1
example.set(0); // logs 0
example.set(0); // doesn't log