我正在学习流星中的反应式编程:
我相信Session.equals(key,value)背后的想法是记住反应变量和期望值之间的关联,这样,如果相等性改变,则更新只会传播到周围的代码。这样,如果我们有数百个依赖于变量的视图,那么当值更改时,只有旧视图和新视图才会触发其更新代码。
请注意,如果我们调用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.
因此reactive-var缺少equals()
,但是reactive-dict有ReactiveDict.equals()。
我真的看不出排除ReactiveVar.equals()
的概念性原因。也许他们没有存储关联的上下文,或者Java的范围界定或其他问题阻止了我不完全理解的问题。
所以我的问题是:这是一个错误吗?
我应该一直使用reactive-dict
吗?在这种情况下,我将更改以下内容:
let myReactiveVar = new ReactiveVar();
...
if(myReactiveVar.get() === 'myValue')
更冗长(但表现出色):
let myReactiveDict = new ReactiveDict();
...
if(myReactiveDict.equals('myReactiveVar','myValue'))
与Session.equals()提供的功能相匹配。
另一种选择是使用我自己的ReactiveVar
方法扩展equals()
原型,或者在子类中继承它并提供MyReactiveVar.equals()
方法。如果有人可以提供示例来执行上述任一变通方法,并且我们可以将其作为拉动请求提交给Meteor维护者,则表示荣誉。
更新:我忘了提到ReactiveVar在其构造函数中确实采用了equalsFunc
可选参数。作为反应性代码块,有可能会在不扩展类的情况下部分实现equals()
功能。另外,这里是related issue on GitHub。
更新:为节省时间,以下是ReactiveVar和ReactiveDict.equals()的相关源代码。我相信value
参数会转换为serializedValue
,然后作为依赖项添加到ReactiveDict
中,但是我仍然看不到为什么不可能做类似的事情为ReactiveVar
。