datadistributor.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. define([], function () {
  2. return function () {
  3. var targets = []
  4. var filterObservers = []
  5. var filters = []
  6. var filteredData
  7. var data
  8. function remove(d) {
  9. targets = targets.filter( function (e) { return d !== e } )
  10. }
  11. function add(d) {
  12. targets.push(d)
  13. if (filteredData !== undefined)
  14. d.setData(filteredData)
  15. }
  16. function setData(d) {
  17. data = d
  18. refresh()
  19. }
  20. function refresh() {
  21. if (data === undefined)
  22. return
  23. filteredData = filters.reduce( function (a, f) {
  24. return f.run(a)
  25. }, data)
  26. targets.forEach( function (t) {
  27. t.setData(filteredData)
  28. })
  29. }
  30. function notifyObservers() {
  31. filterObservers.forEach( function (d) {
  32. d.filtersChanged(filters)
  33. })
  34. }
  35. function addFilter(d) {
  36. filters.push(d)
  37. notifyObservers()
  38. d.setRefresh(refresh)
  39. refresh()
  40. }
  41. function removeFilter(d) {
  42. filters = filters.filter( function (e) { return d !== e } )
  43. notifyObservers()
  44. refresh()
  45. }
  46. function watchFilters(d) {
  47. filterObservers.push(d)
  48. d.filtersChanged(filters)
  49. return function () {
  50. filterObservers = filterObservers.filter( function (e) { return d !== e })
  51. }
  52. }
  53. return { add: add,
  54. remove: remove,
  55. setData: setData,
  56. addFilter: addFilter,
  57. removeFilter: removeFilter,
  58. watchFilters: watchFilters,
  59. refresh: refresh
  60. }
  61. }
  62. })