2016-03-27 2 views
0

Уже нашел вопросы- how should I keep a running total of several values with bacon.js?Использование combineAsArray на изменение набора потоков в BaconJS

Я уже нашел выше вопрос, который имеет дело со статическим набором свойств. Тем не менее, меня интересует вариант, в котором набор свойств является динамическим.

Мой конкретный случай состоит в том, что у меня есть набор вещей, которые могут быть доступны для редактирования, и образуют видимое свойство. Из них я объединяю свойства с combineWith, чтобы получить общую стоимость ВСЕХ событий. (Код в конце)

Прямо сейчас у меня есть свойства, подходящие для статического набора событий с использованием jQuery для получения правильных значений, но идея состоит в том, что пользователь может добавлять (или удалять) событие произвольно, и рассчитанная сумма будет соответствующим образом обновлена.

У меня есть смутное подозрение, что инструмент для работы является combineAsArray и некоторого умного использование события прослушивания на общий предке для всех моих потоков, или, возможно, какое-то Bacon.Bus (динамически подключить потоки в него?), Но Я действительно спиннинг моих колес теперь ...

в (Псевдо) Коде

<table> 
    <tr> 
    <td><input id="thing1" value="40"></input></td> 
    </tr> 
    <tr> 
    <td><input id="thing2" value="40"></input></td> 
    </tr> 
</table> 


$(function() { 
    stream1 = $("#input1").asEventStream("change blur keyup").toProperty(); 
    stream2 = $("#input2").asEventStream("change blur keyup").toProperty(); 
    totalMonthlyCost = Bacon.combineWith(
    sumAll, 
    [stream1, stream2] 
); 
}); 

ответ

3

ключ к объединению изменяющегося набора свойств flatMapLatest. Вы можете начать путем представления текущего набора активных входов в качестве

inputsP = ... 

Из этого можно сопоставить с текущим набором свойств сочетать как

propertiesP = inputP.map(i => i.asEventStream("change").map(() => i.value()).toProperty()) 

Это свойство, значение которого являются массивами Свойства, или в Haskellish, вы можете назвать это Property (Array Property). Вы можете придавить, что в Property Array, или свойство, содержащее массивы значений, просто

valuesP = propertiesP.flatMapLatest(Bacon.combineAsArray).toProperty() 

И, наконец, применить sumAll функцию как в

valuesP.map(sumAll) 

... при условии, что sumAll потребляет массив ценностей в качестве единственного аргумента.

Можно было бы, конечно, утверждать, что существуют более простые способы достижения такого же результата. Подобно прослушиванию всех интересных событий ввода для всего элемента контейнера и grepping входных значений из контейнера с помощью JQuery, загрузка этого материала в sumAll. Как

$container.asEventStream("change blur keyup", "input") 
    .map(() => $container.find("input").toArray().map(() => $(this).value())) 
    .map(sumAll) 

Или что-то в этом роде. См. Также: http://baconjs.blogspot.fi/2013/02/chicken-egg-and-baconjs.html

+0

наткнулся на это сообщение в блоге после публикации. Приятно знать, что я был на правильном пути! – ABMagil

 Смежные вопросы

  • Нет связанных вопросов^_^