diff options
Diffstat (limited to 'js')
-rw-r--r-- | js/directive/NewsScroll.js | 54 |
1 files changed, 23 insertions, 31 deletions
diff --git a/js/directive/NewsScroll.js b/js/directive/NewsScroll.js index 6638c36b0..043235bbf 100644 --- a/js/directive/NewsScroll.js +++ b/js/directive/NewsScroll.js @@ -11,10 +11,10 @@ app.directive('newsScroll', ($timeout) => { 'use strict'; // autopaging - let autoPage = (enabled, limit, items, callback) => { + let autoPage = (enabled, limit, callback, elem) => { if (enabled) { let counter = 0; - for (let item of reverse(items.find('.feed_item'))) { + for (let item of reverse(elem.find('.feed_item'))) { item = $(item); @@ -39,16 +39,15 @@ app.directive('newsScroll', ($timeout) => { }; // mark read - let markRead = (enabled, items, callback) => { + let markRead = (enabled, callback, elem) => { if (enabled) { let ids = []; - let unreadItems = items.find('.feed_item:not(.read)'); - for (let item of unreadItems) { + for (let item of elem.find('.feed_item:not(.read)')) { item = $(item); if (item.position().top <= -50) { - ids.push(parseInt($(item).data('id'), 10)); + ids.push(parseInt(item.data('id'), 10)); } else { break; } @@ -63,57 +62,50 @@ app.directive('newsScroll', ($timeout) => { scope: { 'newsScrollAutoPage': '&', 'newsScrollMarkRead': '&', - 'newsScrollDisabledMarkRead': '=', - 'newsScrollDisabledAutoPage': '=', + 'newsScrollEnabledMarkRead': '=', + 'newsScrollEnableAutoPage': '=', 'newsScrollMarkReadTimeout': '@', // optional, defaults to 1 second 'newsScrollTimeout': '@', // optional, defaults to 1 second - 'newsScrollAutoPageWhenLeft': '@', // optional, defaults to 50 - 'newsScrollItemsSelector': '@' // optional, defaults to .items + 'newsScrollAutoPageWhenLeft': '@' // optional, defaults to 50 }, link: (scope, elem) => { - let scrolling = false; + let allowScroll = true; scope.newsScrollTimeout = scope.newsScrollTimeout || 1; scope.newsScrollMarkReadTimeout = scope.newsScrollMarkReadTimeout || 1; scope.newsScrollAutoPageWhenLeft = scope.newsScrollAutoPageWhenLeft || 50; - scope.newsScrollItemsSelector = - scope.newsScrollItemsSelector || '.items'; - - elem.on('scroll', () => { - - // only allow one scrolling event to trigger - if (!scrolling) { - scrolling = true; + let scrollHandler = () => { + // allow only one scroll event to trigger at once + if (allowScroll) { + allowScroll = false; $timeout(() => { - scrolling = false; + allowScroll = true; }, scope.newsScrollTimeout*1000); - - let items = $(scope.newsScrollItemsSelector); - - // autopaging - autoPage(!scope.newsScrollDisabledAutoPage, + autoPage(scope.newsScrollEnableAutoPage, scope.newsScrollAutoPageWhenLeft, - items, scope.newsScrollAutoPage); - - + scope.newsScrollAutoPage, + elem); // allow user to undo accidental scroll $timeout(() => { - markRead(!scope.newsScrollDisabledMarkRead, items, - scope.newsScrollMarkRead); + markRead(scope.newsScrollEnabledMarkRead, + scope.newsScrollMarkRead, + elem); }, scope.newsScrollMarkReadTimeout*1000); } }); + elem.on('scroll', scrollHandler); + // remove scroll handler if element is destroyed scope.$on('$destroy', () => { - elem.off('scroll'); + elem.off('scroll', scrollHandler); }); } }; |