Skip to content

Commit 9fcbb88

Browse files
committed
Merge pull request #167 from neoeno/add_manual_trigger_event
Add custom event listener to trigger handler manually.
2 parents 78770d7 + b11dbf4 commit 9fcbb88

File tree

4 files changed

+61
-7
lines changed

4 files changed

+61
-7
lines changed

build/ng-infinite-scroll.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* ng-infinite-scroll - v1.2.0 - 2014-12-02 */
1+
/* ng-infinite-scroll - v1.2.0 - 2015-02-14 */
22
var mod;
33

44
mod = angular.module('infinite-scroll', []);
@@ -13,17 +13,19 @@ mod.directive('infiniteScroll', [
1313
infiniteScrollContainer: '=',
1414
infiniteScrollDistance: '=',
1515
infiniteScrollDisabled: '=',
16-
infiniteScrollUseDocumentBottom: '='
16+
infiniteScrollUseDocumentBottom: '=',
17+
infiniteScrollListenForEvent: '@'
1718
},
1819
link: function(scope, elem, attrs) {
19-
var changeContainer, checkWhenEnabled, container, handleInfiniteScrollContainer, handleInfiniteScrollDisabled, handleInfiniteScrollDistance, handleInfiniteScrollUseDocumentBottom, handler, height, immediateCheck, offsetTop, pageYOffset, scrollDistance, scrollEnabled, throttle, useDocumentBottom, windowElement;
20+
var changeContainer, checkWhenEnabled, container, handleInfiniteScrollContainer, handleInfiniteScrollDisabled, handleInfiniteScrollDistance, handleInfiniteScrollUseDocumentBottom, handler, height, immediateCheck, offsetTop, pageYOffset, scrollDistance, scrollEnabled, throttle, unregisterEventListener, useDocumentBottom, windowElement;
2021
windowElement = angular.element($window);
2122
scrollDistance = null;
2223
scrollEnabled = null;
2324
checkWhenEnabled = null;
2425
container = null;
2526
immediateCheck = true;
2627
useDocumentBottom = false;
28+
unregisterEventListener = null;
2729
height = function(elem) {
2830
elem = elem[0] || elem;
2931
if (isNaN(elem.offsetHeight)) {
@@ -110,7 +112,11 @@ mod.directive('infiniteScroll', [
110112
handler = throttle(handler, THROTTLE_MILLISECONDS);
111113
}
112114
scope.$on('$destroy', function() {
113-
return container.unbind('scroll', handler);
115+
container.unbind('scroll', handler);
116+
if (unregisterEventListener != null) {
117+
unregisterEventListener();
118+
return unregisterEventListener = null;
119+
}
114120
});
115121
handleInfiniteScrollDistance = function(v) {
116122
return scrollDistance = parseFloat(v) || 0;
@@ -141,6 +147,9 @@ mod.directive('infiniteScroll', [
141147
}
142148
};
143149
changeContainer(windowElement);
150+
if (scope.infiniteScrollListenForEvent) {
151+
unregisterEventListener = $rootScope.$on(scope.infiniteScrollListenForEvent, handler);
152+
}
144153
handleInfiniteScrollContainer = function(newContainer) {
145154
if ((newContainer == null) || newContainer.length === 0) {
146155
return;

build/ng-infinite-scroll.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/infinite-scroll.coffee

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ mod.directive 'infiniteScroll', ['$rootScope', '$window', '$interval', 'THROTTLE
99
infiniteScrollContainer: '='
1010
infiniteScrollDistance: '='
1111
infiniteScrollDisabled: '='
12-
infiniteScrollUseDocumentBottom: '='
12+
infiniteScrollUseDocumentBottom: '=',
13+
infiniteScrollListenForEvent: '@'
1314

1415
link: (scope, elem, attrs) ->
1516
windowElement = angular.element($window)
@@ -20,6 +21,7 @@ mod.directive 'infiniteScroll', ['$rootScope', '$window', '$interval', 'THROTTLE
2021
container = null
2122
immediateCheck = true
2223
useDocumentBottom = false
24+
unregisterEventListener = null
2325

2426
height = (elem) ->
2527
elem = elem[0] or elem
@@ -103,6 +105,9 @@ mod.directive 'infiniteScroll', ['$rootScope', '$window', '$interval', 'THROTTLE
103105

104106
scope.$on '$destroy', ->
105107
container.unbind 'scroll', handler
108+
if unregisterEventListener?
109+
unregisterEventListener()
110+
unregisterEventListener = null
106111

107112
# infinite-scroll-distance specifies how close to the bottom of the page
108113
# the window is allowed to be before we trigger a new scroll. The value
@@ -155,6 +160,9 @@ mod.directive 'infiniteScroll', ['$rootScope', '$window', '$interval', 'THROTTLE
155160

156161
changeContainer windowElement
157162

163+
if scope.infiniteScrollListenForEvent
164+
unregisterEventListener = $rootScope.$on scope.infiniteScrollListenForEvent, handler
165+
158166
handleInfiniteScrollContainer = (newContainer) ->
159167
# TODO: For some reason newContainer is sometimes null instead
160168
# of the empty array, which Angular is supposed to pass when the

test/spec/ng-infinite-scroll.spec.coffee

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,17 @@ getTemplate = (angularVersion, container, attrs, throttle) ->
2828
$rootScope.enable = function () {
2929
$rootScope.busy = false;
3030
};
31+
32+
$rootScope.triggerEvent = function () {
33+
$rootScope.$emit('anEvent');
34+
};
3135
});
3236
</script>
3337
</head>
3438
<body ng-app="app">
3539
<a id="action" ng-click="enable()">Enable</a>
3640
<a id="force" ng-click="loadMore()">Force</a>
41+
<a id="trigger" ng-click="triggerEvent()">Trigger</a>
3742
#{containers[container].start}
3843
<div infinite-scroll="loadMore()" #{containers[container].attr} #{attrs}>
3944
<p ng-repeat='item in items track by $index'>
@@ -85,6 +90,14 @@ scrollToLastScreenScript = (container, offset) ->
8590
#{calculateChildrenHeightScript(container)} - 2 * #{getElementByIdScript(container)}.offsetHeight + #{offset}
8691
"""
8792

93+
collapseItemsScript = (container) ->
94+
"""
95+
var items = document.getElementsByTagName('p')
96+
for (i = 0; i < items.length; ++i) {
97+
items[i].style.display = 'none'
98+
}
99+
"""
100+
88101
getItems = ->
89102
element.all(By.repeater "item in items")
90103

@@ -137,6 +150,17 @@ describe "ng-infinite-scroll", ->
137150
browser.driver.executeScript(scrollToLastScreenScript(container, 20))
138151
expect(getItems().count()).toBe 200
139152

153+
describe "with an event handler", ->
154+
155+
it "calls the event handler on an event", ->
156+
replaceIndexFile "infinite-scroll-listen-for-event='anEvent'", throttle
157+
browser.get pathToDocument
158+
expect(getItems().count()).toBe 100
159+
browser.driver.executeScript(collapseItemsScript(container))
160+
expect(getItems().count()).toBe 100
161+
element(By.id("trigger")).click()
162+
expect(getItems().count()).toBe 200
163+
140164
describe "with throttling", ->
141165

142166
throttle = browser.params.testThrottleValue
@@ -182,3 +206,16 @@ describe "ng-infinite-scroll", ->
182206
expect(getItems().count()).toBe 100
183207
browser.sleep(throttle)
184208
expect(getItems().count()).toBe 200
209+
210+
describe "with an event handler", ->
211+
212+
it "calls the event handler on an event", ->
213+
replaceIndexFile "infinite-scroll-listen-for-event='anEvent'", throttle
214+
browser.get pathToDocument
215+
expect(getItems().count()).toBe 100
216+
browser.driver.executeScript(collapseItemsScript(container))
217+
expect(getItems().count()).toBe 100
218+
element(By.id("trigger")).click()
219+
expect(getItems().count()).toBe 100
220+
browser.sleep(throttle)
221+
expect(getItems().count()).toBe 200

0 commit comments

Comments
 (0)