Advertisement
Guest User

Untitled

a guest
Feb 6th, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.49 KB | None | 0 0
  1. angular.module('ui.mediaQuery').provider 'mediaQueryService', ->
  2. namedQueries = {}
  3.  
  4. addNamedQueries: (name, query) -> namedQueries[name] = query
  5.  
  6. $get: ($window, $rootScope, $timeout) ->
  7. safeApply = (scope, fn) ->
  8. phase = (scope.$root or $rootScope).$$phase;
  9. if phase is '$apply' or phase is '$digest'
  10. scope.$eval fn
  11. else
  12. scope.$apply fn
  13.  
  14. safeListener = (listener, scope) ->
  15. (mediaQueryList) -> safeApply(scope, -> listener(mediaQueryList))
  16.  
  17. createMediaQueryList = (query) -> $window.matchMedia(namedQueries[query] or query)
  18.  
  19. is: (query) -> createMediaQueryList(query).matches
  20. on: (query, listener, scope) ->
  21. handler = safeListener(listener, scope or $rootScope)
  22. mediaQueryList = createMediaQueryList(query)
  23. mediaQueryList.addListener handler
  24. # immediately return the current mediaQueryList
  25. # as mediaQuery doesn't get trigger on load
  26. $timeout -> handler(mediaQueryList)
  27.  
  28. -> mediaQueryList.removeListener handler
  29.  
  30.  
  31.  
  32. _(
  33. 'mqIf': (mediaQueryList) -> mediaQueryList.matches
  34. 'mqUnless': (mediaQueryList) -> not mediaQueryList.matches
  35. )
  36. .forEach (shouldAttachFn, name) ->
  37. angular.module('ui.mediaQuery').directive name, [
  38. '$document'
  39. 'mediaQueryService'
  40. ($document, mediaQueryService) ->
  41. transclude: 'element'
  42. multiElement: true
  43. priority: 1000
  44. terminal: true
  45. restrict: 'A'
  46. link: ($scope, $element, $attr, ctrl, $transclude) ->
  47. deregister = null;
  48. childScope = null;
  49. cloneElement = null;
  50.  
  51. attachClone = (clone, parent, after) ->
  52. if after then after.after(clone) else parent.append(clone);
  53.  
  54. mqlistener = (mediaQueryList) ->
  55. if shouldAttachFn(mediaQueryList)
  56. unless childScope
  57. $transclude (clone, newScope) ->
  58. childScope = newScope;
  59. clone[clone.length++] = $document[0].createComment("end #{name}: '#{$attr[name]}'");
  60. cloneElement = clone;
  61. attachClone clone, $element.parent(), $element
  62. else
  63. if cloneElement
  64. cloneElement.remove()
  65. cloneElement = null
  66. if childScope
  67. childScope.$destroy()
  68. childScope = null
  69.  
  70. $scope.$watch $attr[name], (value) ->
  71. deregister() if deregister
  72. deregister = mediaQueryService.on value, mqlistener, $scope
  73.  
  74. $scope.$on '$destroy', -> deregister() if deregister
  75. ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement