流星反应性var包缺少equals()方法,这是一个错误吗?

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

https://stephenwalther.com/archive/2014/12/05/dont-do-react-understanding-meteor-reactive-programming

我相信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-dictReactiveDict.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

更新:为节省时间,以下是ReactiveVarReactiveDict.equals()的相关源代码。我相信value参数会转换为serializedValue,然后作为依赖项添加到ReactiveDict中,但是我仍然看不到为什么不可能做类似的事情为ReactiveVar

a692613576 回答:流星反应性var包缺少equals()方法,这是一个错误吗?

equals没有ReactiveVar方法的原因是因为set仅使计算无效,因为新值与当前值不同。

  

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

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

这与ReactiveDict的{​​{1}}方法相似。

请注意,equals上的set并非如此。调用ReactiveDict会广播该值已更改。如果要防止计算无效,那就是使用set

  

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

本文链接:https://www.f2er.com/3107194.html

大家都在问