【问题标题】:Bacon.js Property new value and old valueBacon.js 属性新值和旧值
【发布时间】:2015-09-02 16:21:07
【问题描述】:

使用 Bacon.js 处理 POC,但在属性值方面遇到了一点问题。

我能够在 onValue 回调中检索所有新的属性值,但是我想知道在设置这个新值之前旧的属性值是什么。到目前为止,我还没有找到任何简单或优雅的解决方案来在培根中实现这一点……我错过了什么吗?

甚至 Object.observe() 也有办法获得属性的旧值,令我惊讶的是我在 Bacon 中找不到等效的行为。

有人对如何处理这个问题有任何建议吗?显然,我不想在客户端代码中的任何地方都保留最新的属性值,以便能够在新旧之间进行比较......

【问题讨论】:

  • 不确定..你能举一些例子吗?
  • 可能像in here?

标签: javascript properties observable bacon.js


【解决方案1】:

您可以使用 slidingwindow 创建一个具有 2 个最新值的新 observable:

var myProperty = Bacon.sequentially(10, [1,2,3,4,5]) // replace with real property
var slidingWindow = myProperty.startWith(null).slidingWindow(2,2)
slidingWindow.onValues(function(oldValue, newValue) {
  // do something with the values
})

【讨论】:

  • 太棒了。这比我的千篇一律的方法更有效,也更好。谢谢。
  • 使用slidingWindow 的第二个参数,您也可以使其仅在至少有2 个要比较的值时触发。更进一步,您可以使用onValues 而不是onValue 来减少更多样板。
  • 感谢@raimohanska,使用startWithonValues,这变得更简单了。
  • 实际上@OlliM,您的初始方法是一个更灵活的解决方案。您所做的修改强加了一个严格的要求,即在触发事件之前必须存在两个值,这在所有情况下都不完全合适,至少在我的情况下不合适。我建议你修改你的答案并包括这两种方法..
  • 不应该需要两个值,这就是为什么我添加了.startWith(null),这样当第一个真正的值出来时,slidingWindow 的值是[null, realValue]
【解决方案2】:

由于缺乏原生 Bacon.js 中的功能,我实现了一个自定义解决方案,其中包含一个包装对象,该对象在转发给订阅者后保持最新值。因此,与其直接利用镜头,客户端代码与观察者一起工作,这还具有额外的好处,即通过客户端代码限制通过镜头对模型的写访问,这也是我所需要的。

    function Observer (lens) {
       this.lastValue = undefined;
       this.lens = lens;
    };

    Observer.prototype = {
        onValue(onValueCallback){
            this.subscription = this.lens.onValue(function(newValue) {
                onValueCallback(this.lastValue, newValue);
                this.lastValue = newValue;
            });
        },
    };

    var model = new Bacon.Model({ type : "A"});
    var observer = new Observer(model.lens());
    observer.onValue(function(oldValue,newValue) { ... });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2012-09-18
    相关资源
    最近更新 更多