【发布时间】:2019-11-14 04:12:43
【问题描述】:
我正在学习 Meteor 中的反应式编程:
我相信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() 的概念性原因。也许他们没有存储关联的上下文,或者可能存在一些范围界定或 Javascript 的其他问题阻止了这一点,我不完全理解。
所以我的问题是:这是一个错误吗?
我应该一直使用reactive-dict吗?在这种情况下,我会改变一切:
let myReactiveVar = new ReactiveVar();
...
if(myReactiveVar.get() === 'myValue')
更冗长(但更高效):
let myReactiveDict = new ReactiveDict();
...
if(myReactiveDict.equals('myReactiveVar', 'myValue'))
这将与Session.equals() 提供的功能相匹配。
另一种选择是使用我自己的equals() 方法扩展ReactiveVar 原型,或者在子类中继承它并提供MyReactiveVar.equals() 方法。如果有人可以提供示例来执行这些变通方法中的任何一种,我们可以将其作为拉取请求提交给 Meteor 维护者,这将不胜感激。
更新:我忘了提到 ReactiveVar 在其构造函数中确实采用了equalsFunc 可选参数。有可能将其作为反应代码块破解以部分实现equals() 功能而不扩展类。另外,这里是related issue on GitHub。
更新:为了节省时间,这里是ReactiveVar和ReactiveDict.equals()的相关源码。我相信value 参数会转换为serializedValue,然后作为依赖项添加到ReactiveDict 中,但我仍然不明白为什么不能为ReactiveVar 做类似的事情。
【问题讨论】: