Ng-lazyload-image: рдХреЛрдгреАрдп 5 . рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 9 рдирд╡ре░ 2017  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: tjoskar/ng-lazyload-image

рдирдорд╕реНрддреЗ, рдореИрдВрдиреЗ рдЗрд╕ рдХрд╛рдо рдХреЛ рдХреЛрдгреАрдп 5 рдореЗрдВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд╛рдо рдкрд░ рдирд╣реАрдВ рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдШрдЯрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ рдЬреИрд╕реЗ:

<a class="card clickable" [routerLink]="[product.id]">
    <div class="card-img">
      <img [lazyLoad]="product.logoUrl">
    </div>
  <div class="card-block">
    <span class="card-media-title">{{product.name}}</span>
    <div class="product-version">{{product.version}}</div>
    <div class="product-release-date">{{product.releaseDate}}</div>
  </div>
</a>

рдФрд░ рдПрдХ рдШрдЯрдХ рдЬреИрд╕реЗ

import {Component, Input} from '@angular/core';
import {Product} from '../products.state';

@Component({
  selector: 'app-product-card',
  templateUrl: './product-card.component.html',
  styleUrls: ['./product-card.component.scss']
})
export class ProductCardComponent {

  @Input() product: Product;

  constructor() {
  }

}

рдФрд░ рдореЗрд░рд╛ рдореЙрдбреНрдпреВрд▓

import {NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import {LazyLoadImageModule} from 'ng-lazyload-image';
import {ProductsComponent} from './products.component';
import {ProductsEpic} from './products.epic';
import {ProductsListComponent} from './products-list/products-list.component';
import {ProductCardComponent} from './product-card/product-card.component';
import {ProductsService} from './products.service';
import {ProductsActions} from './products.actions';
import {ProductsEmptyComponent} from './products-empty/products-empty.component';
import {CoreModule} from '../core/core.module';
import {BannerComponent} from './banner/banner.component';
import {RouterModule} from '@angular/router';

@NgModule({
  imports: [
    CommonModule,
    RouterModule,
    CoreModule,
    LazyLoadImageModule
  ],
  declarations: [
    ProductsComponent,
    ProductsListComponent,
    ProductCardComponent,
    ProductsEmptyComponent,
    BannerComponent
  ],
  providers: [
    ProductsService,
    ProductsEpic,
    ProductsActions
  ]
})
export class ProductsModule {
}

рдЫрд╡рд┐ рдмрд╕ рдХрднреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреА рд╣реИред рдореБрдЭреЗ рдпрд╣ рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрджреЗрд╢ рдХрдВрд╕реЛрд▓ рдореЗрдВ рднреА рдорд┐рд▓рддрд╛ рд╣реИ

image

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ рдХреНрд╖рдорд╛рдкреНрд░рд╛рд░реНрдереА рд╣реВрдВред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдореБрджреНрджреЗ рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрд╛ рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╕реАрдПрд╕рдПрд╕ рдХрд╛ рдпрд╣ рдЯреБрдХрдбрд╝рд╛ рдерд╛ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕рднреА рд╕реНрдХреНрд░реЙрд▓ рдЗрд╡реЗрдВрдЯ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рд░рд╣рд╛ рдерд╛

html, body {
  overflow-x: hidden;
}

рдЗрд╕рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░реЙрд▓ рдЗрд╡реЗрдВрдЯ рдХреЛ рдЬреЛрдбрд╝рд╛:

import {Component, Input} from '@angular/core';
import {Product} from '../products.state';
import {Observable} from 'rxjs/Observable';

@Component({
  selector: 'app-product-card',
  templateUrl: './product-card.component.html',
  styleUrls: ['./product-card.component.scss']
})
export class ProductCardComponent {

  @Input() product: Product;
  scrollObservable = Observable.fromEvent(document.body, 'scroll');

  constructor() {
  }

}

рдФрд░ рдореЗрд░реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рддреЛ

<a class="card clickable" [routerLink]="[product.id]">
  <div class="card-img">
    <img [lazyLoad]="product.logoUrl" [scrollObservable]="scrollObservable">
  </div>
  <div class="card-block">
    <span class="card-media-title">{{product.name}}</span>
    <div class="product-version">{{product.version}}</div>
    <div class="product-release-date">{{product.releaseDate}}</div>
  </div>
</a>

рдЕрдм рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЛрдгреАрдп 5 . рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рд╛рдп @ рдПрд▓-рджрд╛рд╡реЛ,

рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдпрд╛ рдЕрдкрдиреЗ рдРрдк рдХреЛ рдкреНрд░реАрдХрдВрдкрд╛рдЗрд▓ рдХрд░реЗрдВ? рдпрд╛ рдЖрдк рдРрдк рдХреЛ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдореЛрдб рдореЗрдВ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ?

рдирдорд╕реНрддреЗред рдирд╣реАрдВ, рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкреНрд░рддрд┐рдкрд╛рджрди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рд╣рд╛рдБ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рджреЗрд╡ рдореЛрдб рдореЗрдВ рдХреЛрдгреАрдп-рдХреНрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░

рдЖрдк рдХреМрди рд╕рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдореИрдВрдиреЗ рдЕрднреА рдХреНрд▓реА (рдХреЛрдгреАрдп 5) рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдХреЛрдгреАрдп рдРрдк рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛ред рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП:

diff --git a/src/app/app.component.html b/src/app/app.component.html
index 46d517b..215f0c9 100644
--- a/src/app/app.component.html
+++ b/src/app/app.component.html
@@ -6,15 +6,21 @@
   <img width="300" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTAgMjUwIj4KICAgIDxwYXRoIGZpbGw9IiNERDAwMzEiIGQ9Ik0xMjUgMzBMMzEuOSA2My4ybDE0LjIgMTIzLjFMMTI1IDIzMGw3OC45LTQzLjcgMTQuMi0xMjMuMXoiIC8+CiAgICA8cGF0aCBmaWxsPSIjQzMwMDJGIiBkPSJNMTI1IDMwdjIyLjItLjFWMjMwbDc4LjktNDMuNyAxNC4yLTEyMy4xTDEyNSAzMHoiIC8+CiAgICA8cGF0aCAgZmlsbD0iI0ZGRkZGRiIgZD0iTTEyNSA1Mi4xTDY2LjggMTgyLjZoMjEuN2wxMS43LTI5LjJoNDkuNGwxMS43IDI5LjJIMTgzTDEyNSA1Mi4xem0xNyA4My4zaC0zNGwxNy00MC45IDE3IDQwLjl6IiAvPgogIDwvc3ZnPg==">
 </div>
 <h2>Here are some links to help you start: </h2>
+<img [defaultImage]="defaultImage" [lazyLoad]="image">
 <ul>
   <li>
     <h2><a target="_blank" rel="noopener" href="https://angular.io/tutorial">Tour of Heroes</a></h2>
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 7b0f672..cf8cead 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -7,4 +7,6 @@ import { Component } from '@angular/core';
 })
 export class AppComponent {
   title = 'app';
+  defaultImage = 'https://www.placecage.com/1000/1000';
+  image = 'https://images.unsplash.com/photo-1443890923422-7819ed4101c0?fm=jpg';
 }
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 926975a..7fb6d9d 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -1,18 +1,13 @@
 import { BrowserModule } from '@angular/platform-browser';
 import { NgModule } from '@angular/core';
+import { LazyLoadImageModule } from 'ng-lazyload-image';
 import { AppComponent } from './app.component';

 @NgModule({
   declarations: [
     AppComponent
   ],
   imports: [
    BrowserModule,
+   LazyLoadImageModule
   ],
   providers: [],
   bootstrap: [AppComponent]
 })
 export class AppModule { }

рдореИрдВрдиреЗ рдПрдХ plnkr рднреА рдмрдирд╛рдпрд╛ (https://embed.plnkr.co/rr046QU9YYWALdX7Xzf6/) рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред
рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдЧрд┐рдЯ рд░реЗрдкреЛ рдпрд╛ рдПрдХ plnkr рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдореИрдВ рдХреНрд╖рдорд╛рдкреНрд░рд╛рд░реНрдереА рд╣реВрдВред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдореБрджреНрджреЗ рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрд╛ рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╕реАрдПрд╕рдПрд╕ рдХрд╛ рдпрд╣ рдЯреБрдХрдбрд╝рд╛ рдерд╛ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕рднреА рд╕реНрдХреНрд░реЙрд▓ рдЗрд╡реЗрдВрдЯ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рд░рд╣рд╛ рдерд╛

html, body {
  overflow-x: hidden;
}

рдЗрд╕рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░реЙрд▓ рдЗрд╡реЗрдВрдЯ рдХреЛ рдЬреЛрдбрд╝рд╛:

import {Component, Input} from '@angular/core';
import {Product} from '../products.state';
import {Observable} from 'rxjs/Observable';

@Component({
  selector: 'app-product-card',
  templateUrl: './product-card.component.html',
  styleUrls: ['./product-card.component.scss']
})
export class ProductCardComponent {

  @Input() product: Product;
  scrollObservable = Observable.fromEvent(document.body, 'scroll');

  constructor() {
  }

}

рдФрд░ рдореЗрд░реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рддреЛ

<a class="card clickable" [routerLink]="[product.id]">
  <div class="card-img">
    <img [lazyLoad]="product.logoUrl" [scrollObservable]="scrollObservable">
  </div>
  <div class="card-block">
    <span class="card-media-title">{{product.name}}</span>
    <div class="product-version">{{product.version}}</div>
    <div class="product-release-date">{{product.releaseDate}}</div>
  </div>
</a>

рдЕрдм рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЛрдгреАрдп 5 . рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

elitenick picture elitenick  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

LobeTia picture LobeTia  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dkmostafa picture dkmostafa  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

vincent-cm picture vincent-cm  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

myrsk picture myrsk  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ