Ng-lazyload-image: Angular 5μ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2017λ…„ 11μ›” 09일  Β·  4μ½”λ©˜νŠΈ  Β·  좜처: tjoskar/ng-lazyload-image

μ•ˆλ…•ν•˜μ„Έμš”, μ €λŠ” Angular 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

λ‚΄κ°€ 뭘 잘λͺ»ν•˜κ³  μžˆλŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 도움을 μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ£„μ†‘ν•©λ‹ˆλ‹€. λ‚΄ 문제λ₯Ό μžμ„Ένžˆ μ‚΄νŽ΄λ³΄λ‹ˆ λΈŒλΌμš°μ €μ—μ„œ λͺ¨λ“  슀크둀 이벀트λ₯Ό λΉ„ν™œμ„±ν™”ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ” 이 CSS 쑰각이 μžˆλŠ” κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€.

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>

이제 Angular 5μ—μ„œ μ™„λ²½ν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€.

λͺ¨λ“  4 λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš” @el-davoλ‹˜,

μ‹ κ³ ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. μ„œλ²„ λ Œλ”λ§μ„ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ 앱을 미리 μ»΄νŒŒμΌν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ 개발 λͺ¨λ“œμ—μ„œ 앱을 μ‹€ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?

μ•ˆλ…•. μ•„λ‹ˆμš”, μ„œλ²„ μΈ‘ λ Œλ”λ§μ„ μˆ˜ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 예, ν˜„μž¬ angular-cliλ₯Ό μ‚¬μš©ν•˜μ—¬ 개발 λͺ¨λ“œμ— μžˆμŠ΅λ‹ˆλ‹€.

μ–΄λ–€ λΈŒλΌμš°μ €λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?
방금 cli(Angular 5)λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒˆ Angular 앱을 λ§Œλ“€μ—ˆκ³  이λ₯Ό μž¬ν˜„ν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. λ‹€μŒκ³Ό 같이 λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€.

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/)도 λ§Œλ“€μ—ˆμ§€λ§Œ 였λ₯˜λ₯Ό μž¬ν˜„ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
였λ₯˜λ₯Ό μž¬ν˜„ν•˜κΈ° μœ„ν•΄ μž‘μ€ git repo λ˜λŠ” plnkr을 λ§Œλ“€ 수 μžˆλ‹€κ³  μƒκ°ν•˜μ‹­λ‹ˆκΉŒ?

μ£„μ†‘ν•©λ‹ˆλ‹€. λ‚΄ 문제λ₯Ό μžμ„Ένžˆ μ‚΄νŽ΄λ³΄λ‹ˆ λΈŒλΌμš°μ €μ—μ„œ λͺ¨λ“  슀크둀 이벀트λ₯Ό λΉ„ν™œμ„±ν™”ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ” 이 CSS 쑰각이 μžˆλŠ” κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€.

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>

이제 Angular 5μ—μ„œ μ™„λ²½ν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰