Advertisement
Guest User

Untitled

a guest
Nov 26th, 2015
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 KB | None | 0 0
  1. m.directive('ionSticky', ['$ionicPosition', '$compile', '$timeout', function ($ionicPosition, $compile, $timeout) {
  2. return {
  3. restrict: 'A',
  4. require: '^$ionicScroll',
  5. link: function ($scope, $element, $attr, $ionicScroll) {
  6. var scroll = angular.element($ionicScroll.element);
  7. var clone;
  8. // creates the sticky clone and adds it to DOM
  9. var createStickyClone = function ($element) {
  10. clone = $element.clone().css({
  11. position: 'absolute',
  12. top: $ionicPosition.position(scroll).top + "px",
  13. left: 0,
  14. right: 0
  15. });
  16. clone[0].className += " assertive";
  17.  
  18. clone.removeAttr('ng-repeat-start');
  19. clone.removeAttr('ng-if');
  20.  
  21. scroll.parent().append(clone);
  22.  
  23. // compile the clone so that anything in it is in Angular lifecycle.
  24. $compile(clone)($scope);
  25. };
  26.  
  27. var removeStickyClone = function () {
  28. if (clone)
  29. clone.remove();
  30. clone = null;
  31. };
  32.  
  33. $scope.$on("$destroy", function () {
  34. // remove the clone, unbind the scroll listener
  35. removeStickyClone();
  36. angular.element($ionicScroll.element).off('scroll');
  37. });
  38.  
  39. var lastActive;
  40. var updateSticky = ionic.throttle(function() {
  41. var active = null;
  42. var dividers = [];
  43. var tmp = $element[0].getElementsByClassName("item-divider");
  44. for (var i = 0; i < tmp.length; ++i) dividers.push(angular.element(tmp[i]));
  45. if (dividers.length == 0) return;
  46. if (!clone) createStickyClone(angular.element(dividers[0][0]))
  47. dividers.sort(function(a, b) { return $ionicPosition.offset(a).top - $ionicPosition.offset(b).top; });
  48. var sctop = $ionicPosition.offset(scroll).top;
  49. if ($ionicPosition.offset(dividers[0]).top - sctop - dividers[0].prop('offsetHeight') > 0) {
  50. var letter = dividers[0][0].innerHTML.trim();
  51. var i = $scope.letters.indexOf(letter);
  52. if (i == 0) return;
  53. active = $scope.letters[i-1];
  54. } else for (var i = 0; i < dividers.length; ++i) { // can be changed to binary search
  55. if ($ionicPosition.offset(dividers[i]).top - sctop - dividers[i].prop('offsetHeight') < 0) { // this equals to jquery outerHeight
  56. if (i === dividers.length-1 || $ionicPosition.offset(dividers[i+1]).top - sctop -
  57. (dividers[i].prop('offsetHeight') + dividers[i+1].prop('offsetHeight')) > 0) {
  58. active = dividers[i][0].innerHTML.trim();
  59. break;
  60. }
  61. }
  62. }
  63. if (lastActive != active) {
  64. if (active) clone[0].innerHTML = active;
  65.  
  66. if (lastActive) {
  67. var e = scroll.parent()[0].getElementsByClassName(lastActive);
  68. if (e && e[0]) e[0].className = e[0].className.replace(/assertive/g,'');
  69. }
  70. if (active) {
  71. var e = scroll.parent()[0].getElementsByClassName(active);
  72. if (e && e[0]) e[0].className += " assertive";
  73. }
  74. lastActive = active;
  75. }
  76. }, 200);
  77. scroll.on('scroll', function (event) {
  78. updateSticky();
  79. });
  80. }
  81. }
  82. }]);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement