2015-09-02 4 views
1

Работа с POC с использованием Bacon.js и запуск небольшого количества проблем с значениями свойств.Bacon.js Свойство новое значение и старое значение

Я могу получить все новые значения свойств в обратном вызове onValue, однако я хотел бы знать, какое значение старого свойства было до того, как это новое значение было установлено. До сих пор я не нашел легкого или элегантного решения для достижения этого в Бэконе из коробки ... Я что-то упустил.

Даже Object.observe() имеет способ добраться до старого значения свойства, так что я удивлен, что не могу найти эквивалентное поведение в Bacon.

У кого-нибудь есть предложения, как справиться с этим? Очевидно, что я не хочу оставаться последним значение свойства в коде клиента strcily ради того, чтобы быть в состоянии сделать сравнение между старым и новым ...

+0

ли 'scan' делать? – Bergi

+0

Не уверен .. можете ли вы привести пример, как это будет работать? – Moonwalker

+0

Возможно, как [здесь] (http://stackoverflow.com/a/29760362/1048572)? – Bergi

ответ

1

Вы можете использовать slidingwindow для создания новой наблюдаемой с 2 ​​последних значений:

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 
}) 
+0

Блестящий. Это работает отлично и намного приятнее, чем мой резак для печенья. Спасибо. – Moonwalker

+0

Используя второй аргумент в 'slideWindow', вы также можете активировать его только тогда, когда для сравнения требуется не менее двух значений. Кроме того, вы можете использовать 'onValues' вместо' onValue', чтобы вырезать еще один шаблон. – raimohanska

+0

Спасибо @raimohanska, используя 'startWith' и' onValues', это стало еще проще. – OlliM

0

Из-за отсутствие функциональности в нативном Bacon.js Я внедрил собственное решение с объектом-оболочкой, который сохраняет последнее значение после того, как он был отправлен подписчику. Таким образом, вместо того, чтобы нажимать на объектив, клиентский код работает с obsever, который также имеет дополнительные преимущества ограничения доступа на запись к модели через объектив из клиентского кода, который мне тоже нужен.

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) { ... }); 
Смежные вопросы