Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- angular.module('ui.mediaQuery').provider 'mediaQueryService', ->
- namedQueries = {}
- addNamedQueries: (name, query) -> namedQueries[name] = query
- $get: ($window, $rootScope, $timeout) ->
- safeApply = (scope, fn) ->
- phase = (scope.$root or $rootScope).$$phase;
- if phase is '$apply' or phase is '$digest'
- scope.$eval fn
- else
- scope.$apply fn
- safeListener = (listener, scope) ->
- (mediaQueryList) -> safeApply(scope, -> listener(mediaQueryList))
- createMediaQueryList = (query) -> $window.matchMedia(namedQueries[query] or query)
- is: (query) -> createMediaQueryList(query).matches
- on: (query, listener, scope) ->
- handler = safeListener(listener, scope or $rootScope)
- mediaQueryList = createMediaQueryList(query)
- mediaQueryList.addListener handler
- # immediately return the current mediaQueryList
- # as mediaQuery doesn't get trigger on load
- $timeout -> handler(mediaQueryList)
- -> mediaQueryList.removeListener handler
- _(
- 'mqIf': (mediaQueryList) -> mediaQueryList.matches
- 'mqUnless': (mediaQueryList) -> not mediaQueryList.matches
- )
- .forEach (shouldAttachFn, name) ->
- angular.module('ui.mediaQuery').directive name, [
- '$document'
- 'mediaQueryService'
- ($document, mediaQueryService) ->
- transclude: 'element'
- multiElement: true
- priority: 1000
- terminal: true
- restrict: 'A'
- link: ($scope, $element, $attr, ctrl, $transclude) ->
- deregister = null;
- childScope = null;
- cloneElement = null;
- attachClone = (clone, parent, after) ->
- if after then after.after(clone) else parent.append(clone);
- mqlistener = (mediaQueryList) ->
- if shouldAttachFn(mediaQueryList)
- unless childScope
- $transclude (clone, newScope) ->
- childScope = newScope;
- clone[clone.length++] = $document[0].createComment("end #{name}: '#{$attr[name]}'");
- cloneElement = clone;
- attachClone clone, $element.parent(), $element
- else
- if cloneElement
- cloneElement.remove()
- cloneElement = null
- if childScope
- childScope.$destroy()
- childScope = null
- $scope.$watch $attr[name], (value) ->
- deregister() if deregister
- deregister = mediaQueryService.on value, mqlistener, $scope
- $scope.$on '$destroy', -> deregister() if deregister
- ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement