datadistributor.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. define(["filters/nodefilter"], function (NodeFilter) {
  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. var filter = filters.reduce( function (a, f) {
  24. return function (d) {
  25. return a(d) && f.run(d)
  26. }
  27. }, function () { return true })
  28. filteredData = new NodeFilter(filter)(data)
  29. targets.forEach( function (t) {
  30. t.setData(filteredData)
  31. })
  32. }
  33. function notifyObservers() {
  34. filterObservers.forEach( function (d) {
  35. d.filtersChanged(filters)
  36. })
  37. }
  38. function addFilter(d) {
  39. filters.push(d)
  40. notifyObservers()
  41. d.setRefresh(refresh)
  42. refresh()
  43. }
  44. function removeFilter(d) {
  45. filters = filters.filter( function (e) { return d !== e } )
  46. notifyObservers()
  47. refresh()
  48. }
  49. function watchFilters(d) {
  50. filterObservers.push(d)
  51. d.filtersChanged(filters)
  52. return function () {
  53. filterObservers = filterObservers.filter( function (e) { return d !== e })
  54. }
  55. }
  56. return { add: add,
  57. remove: remove,
  58. setData: setData,
  59. addFilter: addFilter,
  60. removeFilter: removeFilter,
  61. watchFilters: watchFilters,
  62. refresh: refresh
  63. }
  64. }
  65. })