kahuna/public/js/directives/gr-remember-scroll-top.js (26 lines of code) (raw):

import angular from 'angular'; import Rx from 'rx'; import 'rx-dom'; import {rxUtil} from '../util/rx'; export const rememberScrollTop = angular.module('gr.rememberScrollTop', [ rxUtil.name ]); rememberScrollTop.directive('grRememberScrollTop', ['subscribe$', function (subscribe$) { const storageKey = 'gr:rememberScrollTop'; return { restrict: 'A', link: function(scope, element, attrs) { // Only remember if attribute if truthy. This is an annoying workaround to the // inability to add directives conditionally if (scope.$eval(attrs.grRememberScrollTop)) { const scrollEvents$ = Rx.DOM.fromEvent(element[0], 'scroll').debounce(500); const scrollTop$ = scrollEvents$.map(ev => ev.target.scrollTop); subscribe$(scope, scrollTop$, ev => { window.localStorage.setItem(storageKey, ev); }); scope.$on('gr:remember-scroll-top:apply', () => { // Note: Number(null) -> 0 const scrollTop = Number(window.localStorage.getItem(storageKey)); element[0].scrollTop = scrollTop; }); } } }; }]);