deps-parser.js 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. var Emitter = require('./emitter'),
  2. utils = require('./utils'),
  3. observer = new Emitter()
  4. /**
  5. * Auto-extract the dependencies of a computed property
  6. * by recording the getters triggered when evaluating it.
  7. */
  8. function catchDeps (binding) {
  9. if (binding.isFn) return
  10. utils.log('\n─ ' + binding.key)
  11. var depsHash = utils.hash()
  12. observer.on('get', function (dep) {
  13. if (depsHash[dep.key]) return
  14. depsHash[dep.key] = 1
  15. utils.log(' └─ ' + dep.key)
  16. binding.deps.push(dep)
  17. dep.subs.push(binding)
  18. })
  19. binding.value.get()
  20. observer.off('get')
  21. }
  22. module.exports = {
  23. /**
  24. * the observer that catches events triggered by getters
  25. */
  26. observer: observer,
  27. /**
  28. * parse a list of computed property bindings
  29. */
  30. parse: function (bindings) {
  31. utils.log('\nparsing dependencies...')
  32. observer.isObserving = true
  33. bindings.forEach(catchDeps)
  34. observer.isObserving = false
  35. utils.log('\ndone.')
  36. }
  37. }