Skip to content

Commit ead8821

Browse files
committed
feat(ImageLoader): add ability to manually check inviewport status
1 parent 72d9b3f commit ead8821

File tree

8 files changed

+48
-15
lines changed

8 files changed

+48
-15
lines changed

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,20 @@ export class AppComponent {
134134
}
135135
```
136136

137+
### Check inviewport status manually
138+
139+
```html
140+
<sn-image-loader
141+
[image]="image"
142+
[sizes]="sizes"
143+
imgClass="img"
144+
alt="lorem ipsum"
145+
#imgEl>
146+
</sn-image-loader>
147+
148+
<button (click)="imgEl.checkInViewportStatus()">Check status</button>
149+
```
150+
137151
## Video Loader Example
138152

139153
### `app.component.html`

src/app/app.component.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ <h3>Bottom image</h3>
1919
alt="lorem ipsum"
2020
(placeholderLoaded)="onPlaceholderLoad($event)"
2121
(imageLoaded)="onImageLoad($event)"
22-
class="sn-image-loader sn-image-loader--bottom">
22+
class="sn-image-loader sn-image-loader--bottom"
23+
#imgEl>
2324
</sn-image-loader>
25+
<button (click)="imgEl.checkInViewportStatus()">Check</button>
2426
<h3>Bottom image imageLoaded event count: <span class="image-loaded-count">{{ imageLoadedEventCount }}</span></h3>
2527
<div class="spacer"></div>
2628

src/app/image-loader/image-loader/image-loader.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<img
22
#img
3+
#snInViewport="snInViewport"
34
[src]="src"
45
[srcset]="srcset"
56
[alt]="alt"

src/app/image-loader/image-loader/image-loader.component.spec.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { TestBed, async, ComponentFixture } from '@angular/core/testing';
22
import { NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
33
import { By } from '@angular/platform-browser';
44

5-
import { WindowRef } from '@thisissoon/angular-inviewport';
5+
import { InViewportModule } from '@thisissoon/angular-inviewport';
66

77
import { ImageLoaderComponent } from './image-loader.component';
88
import { ResponsiveImage } from '../shared/image.model';
@@ -50,8 +50,8 @@ describe('ImageLoaderComponent', () => {
5050
declarations: [
5151
ImageLoaderComponent
5252
],
53-
providers: [
54-
WindowRef
53+
imports: [
54+
InViewportModule.forRoot()
5555
],
5656
});
5757

@@ -207,4 +207,9 @@ describe('ImageLoaderComponent', () => {
207207
expect(component.src).toEqual('');
208208
});
209209

210+
it('should check inviewport status', () => {
211+
const spy = spyOn(component.snInViewport, 'calculateInViewportStatus');
212+
component.checkInViewportStatus();
213+
expect(spy).toHaveBeenCalled();
214+
});
210215
});

src/app/image-loader/image-loader/image-loader.component.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { Subject } from 'rxjs/Subject';
1616
import { Observable } from 'rxjs/Observable';
1717
import { fromEvent } from 'rxjs/observable/fromEvent';
1818
import { takeUntil, debounceTime } from 'rxjs/operators';
19-
import { WindowRef } from '@thisissoon/angular-inviewport';
19+
import { WindowRef, InViewportDirective } from '@thisissoon/angular-inviewport';
2020

2121
import * as classes from '../shared/classes';
2222
import * as events from '../shared/events';
@@ -33,7 +33,7 @@ import {
3333
* for the device size
3434
*
3535
* @example
36-
* ```
36+
* ```html
3737
* <sn-image-loader
3838
* [image]="image"
3939
* [sizes]="sizes"
@@ -128,12 +128,19 @@ export class ImageLoaderComponent implements OnInit, AfterViewInit, OnDestroy {
128128
*/
129129
public ngUnsubscribe$ = new Subject<void>();
130130
/**
131-
* Reference to dummy image element
131+
* Reference to image element
132132
*
133133
* @memberof ImageLoaderComponent
134134
*/
135135
@ViewChild('img')
136136
public img: ElementRef;
137+
/**
138+
* Reference to instance of inViewport directive instance
139+
*
140+
* @memberof ImageLoaderComponent
141+
*/
142+
@ViewChild('snInViewport')
143+
public snInViewport: InViewportDirective;
137144
/**
138145
* If true it means the browser supports `srcset`
139146
* @memberof ImageLoaderComponent
@@ -210,6 +217,12 @@ export class ImageLoaderComponent implements OnInit, AfterViewInit, OnDestroy {
210217
);
211218
});
212219
}
220+
/**
221+
* Checks if image element is in viewport
222+
*/
223+
public checkInViewportStatus(): void {
224+
this.snInViewport.calculateInViewportStatus();
225+
}
213226
/**
214227
* If element is in viewport preload image by setting the src
215228
* of the dummy image element.

src/app/video-loader/video-loader/video-loader.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
[attr.playsinline]="playsInline"
1212
(loadeddata)="onVideoLoad()"
1313
(inViewportChange)="onInViewportChange($event)"
14-
#videoEl="snInViewport"
14+
#snInViewport="snInViewport"
1515
snInViewport>
1616

1717
<sn-image-loader

src/app/video-loader/video-loader/video-loader.component.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ describe('VideoLoaderComponent', () => {
101101
});
102102

103103
it('should check inviewport status', () => {
104-
const spy = spyOn(component.videoEl, 'calculateInViewportStatus');
104+
const spy = spyOn(component.snInViewport, 'calculateInViewportStatus');
105105
component.checkInViewportStatus();
106106
expect(spy).toHaveBeenCalled();
107107
});

src/app/video-loader/video-loader/video-loader.component.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { ImageLoadedEvent } from '../../image-loader/shared/image-loaded-event.m
2626
* video and poster for the device size
2727
*
2828
* @example
29-
* ```
29+
* ```html
3030
* <sn-video-loader
3131
* [sizes]="sizes"
3232
* [video]="video"
@@ -104,11 +104,9 @@ export class VideoLoaderComponent implements AfterViewInit, OnDestroy {
104104
/**
105105
* Reference to inviewport directive instance
106106
*
107-
* @type {InViewportDirective}
108-
* @memberof VideoLoaderComponent
109107
*/
110-
@ViewChild('videoEl')
111-
public videoEl: InViewportDirective;
108+
@ViewChild('snInViewport')
109+
public snInViewport: InViewportDirective;
112110
/**
113111
* List of breakpoints to select video from
114112
*
@@ -235,7 +233,7 @@ export class VideoLoaderComponent implements AfterViewInit, OnDestroy {
235233
* @memberof VideoLoaderComponent
236234
*/
237235
public checkInViewportStatus(): void {
238-
this.videoEl.calculateInViewportStatus();
236+
this.snInViewport.calculateInViewportStatus();
239237
}
240238
/**
241239
* On width change, determine if device has changed and

0 commit comments

Comments
 (0)