Ionic-framework: RC4 ion-img๊ฐ€ virtualScroll์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 12์›” 16์ผ  ยท  90์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ionic-team/ionic-framework

Ionic ๋ฒ„์ „: ("x"๋กœ ํ•˜๋‚˜ ์„ ํƒ)
[ ] 1.x
[x] 2.x

์ œ์ถœ ์ค‘์ž…๋‹ˆ๋‹ค ... ( "x"๋กœ ํ•˜๋‚˜ ์„ ํƒ)
[x] ๋ฒ„๊ทธ ๋ณด๊ณ ์„œ
[ ] ๊ธฐ๋Šฅ ์š”์ฒญ
[ ] ์ง€์› ์š”์ฒญ => ์—ฌ๊ธฐ์— ์ง€์› ์š”์ฒญ์„ ์ œ์ถœํ•˜์ง€ ๋ง๊ณ  ๋‹ค์Œ ์ฑ„๋„ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. https://forum.ionicframework.com/ ๋˜๋Š” http://ionicworldwide.herokuapp.com/

ํ˜„์žฌ ํ–‰๋™:
virtualScroll ๋ฐ ion-img๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•œ ํ›„(๋ฒ„ํผ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ) ion-img๊ฐ€ ์ด๋ฏธ์ง€ ๋กœ๋“œ๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

_034

์ฝ”๋“œ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

2016-12-16 10-23-17

URL http://base247.lin2/thumbs/c6/files_56_222bf7a3335ce7c20553f0f374eb0266b871af41.jpg_mobileListImage_1412346660_3.jpg

(๋‚ด ๋กœ์ปฌ ์ปดํ“จํ„ฐ์˜ ๊ฒฝ์šฐ) ์ •ํ™•ํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘:
ion-img๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์žฌํ˜„ ๋‹จ๊ณ„:

๊ด€๋ จ ์ฝ”๋“œ:

<ion-content>
    <ion-refresher (ionRefresh)="dataService.refresh($event)">
    <ion-refresher-content
        pullingText="ะŸะพั‚ัะฝะธั‚ะต ะดะปั ะพะฑะฝะพะฒะปะตะฝะธั"
        refreshingText="ะ—ะฐะณั€ัƒะทะบะฐ">
    </ion-refresher-content>
</ion-refresher>
    <ion-list [hidden]="(works|filterWorks:filter.price.mode:filter.price.from:filter.price.to:filter.price.currency_id:filter.location.mode:filter.added.mode:sort.orderBy:commonData).length==0" [virtualScroll]="works|filterWorks:filter.price.mode:filter.price.from:filter.price.to:filter.price.currency_id:filter.location.mode:filter.added.mode:sort.orderBy:commonData" approxItemHeight="80px" >
    <ion-item-sliding *virtualItem="let work">
        <button ion-item (click)="goWork(work)" [ngClass]="{'work-list-item-selected':selectedWorks.works[work.id]}">
            <ion-thumbnail item-left>
                                    <ion-img [src]="work.image|defaultImage"></ion-img>
                            </ion-thumbnail>
                        <h3>{{commonData.authors[work.author_id]?.title}}</h3>
            <h5>{{work.title}}</h5>
            <p class="work-list-price">{{work.price | price : work.price_currency_id : commonData.currencyExchangeRate : true}}</p>
            <p>{{work.year ? work.year+',':''}} {{work.techniques | techniques : commonData.techniques : commonData.mainLanguageId}}</p>
        </button>
        <ion-item-options side="left">
            <button ion-button icon-only color="primary" (click)="selectedWorks.toggle(work)">
                <ion-icon name="{{selectedWorks.works[work.id] ? 'checkmark-circle':'radio-button-off'}}"></ion-icon>
            </button>
        </ion-item-options>
        <ion-item-options side="right">
            <button ion-button icon-left color="primary" (click)="sendWorkByEmail(work)">
                <ion-icon name="mail"></ion-icon>
                Email
            </button>
        </ion-item-options>
    </ion-item-sliding>
</ion-list>
</ion-content>

๊ธฐํƒ€ ์ •๋ณด:

๋ฒ„๊ทธ๋Š” RC4์—์„œ ๋‚˜ํƒ€๋‚ฌ๊ณ  RC3์—์„œ๋Š” ๋ชจ๋‘ ์ •์ƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

Ionic ์ •๋ณด: (ํ„ฐ๋ฏธ๋„/cmd ํ”„๋กฌํ”„ํŠธ์—์„œ ionic info ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ถœ๋ ฅ์„ ์•„๋ž˜์— ๋ถ™์—ฌ๋„ฃ๊ธฐ):

Cordova CLI: 6.3.1 
Ionic Framework Version: 2.0.0-rc.4
Ionic CLI Version: 2.1.13
Ionic App Lib Version: 2.1.7
Ionic App Scripts Version: 0.0.45
ios-deploy version: Not installed
ios-sim version: Not installed
OS: Linux 4.4
Node Version: v4.2.6
Xcode version: Not installed

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” ๋˜ํ•œ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋ฒ„๊ทธ๋Š” ion-img์—์„œ img::top ๋ฐ img::bottom ์˜ ๊ณ„์‚ฐ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์Šคํฌ๋กคํ•˜๋Š” ๋™์•ˆ ion-img $์— ๋Œ€ํ•ด $ Content::updateImgs ํ”Œ๋ž˜๊ทธ canRequest ๋ฐ canRender ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๋‚ด ์ฒซ ๋ฒˆ์งธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ฐ€์ƒ ๋ชฉ๋ก์— ๋Œ€ํ•ด ion-img ๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

import {Component, ElementRef, Renderer, Optional} from "@angular/core";
import {Img, Platform, DomController, Content} from "ionic-angular";

@Component({
  selector: 'virtual-ion-img',
  template: '<img>'
})
export class VirtualIonImg extends Img {
  constructor(private __elementRef: ElementRef,
              __renderer: Renderer,
              __plt: Platform,
              @Optional() private __content: Content,
              __dom: DomController) {
    super(__elementRef, __renderer, __plt, __content, __dom);
  }

  get top(){
    this._rect = (<HTMLElement>this.__elementRef.nativeElement).getBoundingClientRect();
    return this._rect.top + this.__content.scrollTop - this.__content._cTop;
  }
  get bottom(){
    this._rect = (<HTMLElement>this.__elementRef.nativeElement).getBoundingClientRect();
    return this._rect.bottom + this.__content.scrollTop - this.__content._cTop;
  }
}

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ํŽ˜์ด์ง€์—์„œ ์ด ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ Content::imgsUpdate ์˜ ๊ณ„์‚ฐ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

import {updateImgs} from "ionic-angular/components/content/content";
import {Component, ViewChild} from "@angular/core";
import {Content} from "ionic-angular";

@Component({
  templateUrl: 'virtual-list.html',
})
export class VirtualListPage {
  @ViewChild(Content) _content: Content;
  ngAfterViewInit(){
    if(this._content) {
      this._content.imgsUpdate = () => {
        if (this._content._scroll.initialized && this._content._imgs.length && this._content.isImgsUpdatable()) {
          // reset cached bounds
          this._content._imgs.forEach((img:Img)=>img._rect = null);
          // use global position to calculate if an img is in the viewable area
          updateImgs(this._content._imgs, this._content._cTop * -1, this._content.contentHeight, this._content.directionY, 1400, 400);
        }
      };
    }
  }
}

๋ชจ๋“  90 ๋Œ“๊ธ€

rc4๋กœ ์—…๋ฐ์ดํŠธํ•œ ํ›„ ๋‚ด ์•ฑ์— ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” RC 4์—์„œ ๋น„์Šทํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ๋Š”๋ฐ RC 3์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ชฝ์—์„œ๋„ ๊ฐ™์€ ๋ฌธ์ œ

"ion-img"๋Œ€์‹  "img"๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค. ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ๋‹ค.

"ion-img"๋Š” rc4์—์„œ๋„ ์ž‘๋™์„ ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค(๊ฐ€์ƒ ์Šคํฌ๋กค ์—†์ด๋„). "img"๋กœ ๋ฐ”๊พธ๋ฉด ๋” ๊ธด ๋ชฉ๋ก์—์„œ ์ผ๋ถ€ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@sajTemler ์˜ˆ ์ž‘๋™ํ•˜์ง€๋งŒ ion-img์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ๊ฐ™์€ ์„ฑ๋Šฅ ์ด์ ์„ ์žƒ์Šต๋‹ˆ๋‹ค.

ng2 ์ง€์—ฐ ๋กœ๋”๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2๊ฐœ ์ด์ƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค https://github.com/tjoskar/ng2-lazyload-image

์ฐจ์˜ค ์—ฌ๋Ÿฌ๋ถ„,
ion-img๋Š” ํƒœ๊ทธ๊ฐ€ ๋ณด์ด๋Š” ์ฝ˜ํ…์ธ ์— ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ชฉ๋ก, ์„ธ๊ทธ๋จผํŠธ ๋“ฑ .... ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚ด ์ž„์‹œ ์ˆ˜์ • ์‚ฌํ•ญ:

  1. node_modules/ ionic-angular/component/img/img.js ์—ด๊ธฐ
  2. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ngAferContentInit ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค.

    Img.prototype.ngAfterContentInit = ํ•จ์ˆ˜() {
    var _this = ์ด๊ฒƒ;
    this._img = this._elementRef.nativeElement.firstChild;

    if(!this._img.hasAttribute("src")){
    
    
        this._img.src=this._elementRef.nativeElement.getAttribute("src");
    
    }
    
    this._unreg = this._platform.addEventListener(this._img, 'load', function () {
        _this._hasLoaded = true;
        _this.update();
    }, { passive: true });
    

    };

Ionic ํŒ€์˜ ๋น ๋ฅธ ์ˆ˜์ •์„ ๋ฐ”๋ž๋‹ˆ๋‹ค. :)

์—ฌ๋Ÿฌ๋ถ„ ์•ˆ๋…•ํ•˜์„ธ์š”! Ionic์„ ์‚ฌ์šฉํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋ˆ„๊ตฐ๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@jgw96 ์ƒ˜ํ”Œ์„ ์ด๋ฉ”์ผ๋กœ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค

์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? "ion-img"๊ฐ€ ๋‚ด ์•ฑ์—์„œ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ ์ž ์‹œ ๋™์•ˆ ์„ค๋ช…์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ํ•ด๊ฒฐ๋˜์—ˆ๋‚˜์š”?

@naveedahmed1 ์—ฌ๊ธฐ์— ์ƒ˜ํ”Œ์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐ™์€ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

non-virtualScroll ๊ทธ๋ฆฌ๋“œ์—์„œ๋„ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. plunker ์—์„œ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ํ•œํ•œ(non-virtualScroll) ๋ชฉ๋ก์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ion-infinite-scroll์„ ๋ชฉ๋ก์— ์ถ”๊ฐ€ ํ•  ๋•Œ๋งˆ๋‹ค ion-images๋Š” ๋กœ๋”ฉ ๋ฐ ์–ธ๋กœ๋”ฉ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ '์ผ๋ฐ˜' ๋ชฉ๋ก์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. virtualScroll ๋˜๋Š” InfinityScroll์ด ์žˆ๋Š” ๋ชฉ๋ก์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

RC5 - ๋™์ผํ•œ ๋ฌธ์ œ

๋ถ„๋ช…ํžˆ ion-img๋Š” virtualScroll๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
https://github.com/driftyco/ionic/commit/a5bbbd55cbd0e256614b6a1062aabbab4b1f21bd

๋‚˜๋Š” @pavimus ์™€ ์ •ํ™•ํžˆ ๊ฐ™์€ ํ–‰๋™์„ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์ƒ ์Šคํฌ๋กค ๋ฒ„ํผ ํ›„์— ์ด๋ฏธ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๊ณ  CSS ํด๋ž˜์Šค๊ฐ€ "img-unloaded"์ž…๋‹ˆ๋‹ค(์•„๋ž˜ ์Šคํฌ๋ฆฐ์ƒท ์ฐธ์กฐ).

ionimg

์ด์˜จ 2 ํŒŒ์ด๋„๊ณผ ํ•จ๊ป˜. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์˜์‚ฌ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ตœ์‹  ionic์—๋„์ด ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ์ด๋ฏธ์ง€ ๊ทธ๋ฆฌ๋“œ(๊ฐ€์ƒ ์Šคํฌ๋กค์ด ์—†๋Š” ์ด์˜จ ๊ทธ๋ฆฌ๋“œ)์—์„œ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์ด ์ •๋ง๋กœ ํ•„์š”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์ ํŠธ์˜ <project_root>/node_modules/ionic-angular/components/img/img.js ํŒŒ์ผ์„ ์ผ์‹œ์ ์œผ๋กœ ์ด ์š”์ง€ ๋กœ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฃผ๋ณ€์„ ํŒŒํ—ค์นœ ํ›„ ion-img์˜ _top_ ๋ฐ _bottom_์ด ์ปจํ…Œ์ด๋„ˆ์˜ ์ ˆ๋Œ€ ์ƒ๋‹จ์— ์ƒ๋Œ€์ ์ด์ง€ ์•Š์•„ ์ž˜๋ชป๋œ ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ/์–ธ๋กœ๋“œ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์š”์ง€์˜ 231 ํ–‰๊ณผ 242 ํ–‰์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ion-img ํ™•์žฅ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋งŽ์€ ์„ฑ๊ณต์„ ๊ฑฐ๋‘์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Ionic dist ํŒŒ์ผ์˜ (์ž„์‹œ) ์‚ฌ์šฉ์ž ์ •์˜ ๋ฒ„์ „์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์ด๋ฅผ ๋กœ์ปฌ ์ข…์†์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ƒ๊ฐ๋ณด๋‹ค ๋ณต์žกํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Ionic ํŒ€์ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@sajTemler ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์Šคํฌ๋กค์ด ๋ฉˆ์ถ˜ ๊ฒฝ์šฐ์—๋งŒ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ฒ„๊ทธ ๋ฐ ๊ธฐํƒ€ ๋ช‡ ๊ฐ€์ง€(ํฌ๋กฌ/์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ์ด๋ฏธ์ง€ ๋ฐ 5x5๋งŒ, ์Šคํฌ๋กคํ•˜๊ธฐ ์ „์— ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š์Œ..)๋Š” ์ง€์—ฐ ๋กœ๋“œ๋œ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋Š” ๊ธฐ์‚ฌ ํ‘œ์‹œ์— ํฌ๊ฒŒ ์˜์กดํ•˜๋Š” ํ”„๋กœ๋•์…˜ ์•ฑ์„ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์–ป์ง€ ๋ชปํ•œ ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒˆ๋กœ์šด ์†Œ์‹์ด ์•„๋‹™๋‹ˆ๋‹ค.

@ventr1x ์ด ์น˜๋ช…์ ์ธ ๋ฒ„๊ทธ๊ฐ€ 12์›” 16์ผ๋ถ€ํ„ฐ ์•„์ง ์—ด๋ ค ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๊นจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค(์‹ค์ œ๋กœ ์ž‘๋™ํ•œ ์ ์ด ์—†์œผ๋ฉฐ ๋ฒ ํƒ€์—์„œ๋Š” ์–ด๋–ค ๋ฌธ์„œ์—์„œ๋„ ์–ธ๊ธ‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค).

๋‚˜๋Š” ng2-lazyload-image๋กœ ์ „ํ™˜ํ•˜๊ณ  rc6๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค(์ผ๋ถ€๋Š” ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€ ๋™์ผํ•œ ์ž‘์—…์„ ๊ฑฐ์น˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.):

์š”์†Œ

import { Component, ViewChild } from '@angular/core';
import { Content } from 'ionic-angular';

@Component({
  templateUrl: 'image-modal.html'
})
export class ImageModal {
  @ViewChild(Content) content: Content;

  constructor() {
  }

}

๋ณด๋‹ค
<img [src]="img" [lazyLoad]="img" [scrollObservable]="content.ionScroll" />

@ventr1x ์‚ฌ์šฉ์ž๊ฐ€ ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์Šคํฌ๋กค์„ ๋ฉˆ์ท„์„ ๋•Œ๋งŒ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

@jgw96 ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์„œ๋„ ๊ฐ™์€ ๋ฌธ์ œ..
ion-img ๋ฅผ segment $ ์•ˆ์— ๋„ฃ์œผ๋ฉด ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
http://plnkr.co/edit/Zb2EQQVCFgdyZ1CRfPsW?p=preview

https://github.com/shprink/ionic-withwebworker-vs-withoutwebworker ์—์„œ Ionic 3.1.1๋กœ ์‰ฝ๊ฒŒ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์—†์ง€๋งŒ @shprink ์›น ์ž‘์—…์ž ์—์„œ ์™„์ „ํ•œ ์ด์˜จ ์•ฑ์„ ์‹คํ–‰ํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

์•„์ง @naveedahmed1 ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ณต์œ ํ•œ ๋งํฌ์˜ URL์— webworker๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์‹œ๋„ํ•ด ๋ณด์…จ์„ ๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์„œ๋น„์Šค ์›Œ์ปค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถˆํ–‰ํžˆ๋„ ์„œ๋น„์Šค ์ž‘์—…์ž๋Š” ์žฅ์น˜์—์„œ ์ง€์›๋˜์ง€ ์•Š์ง€๋งŒ ์›น ์ž‘์—…์ž๋Š” ์žฅ์น˜์—์„œ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์ƒ ์Šคํฌ๋กค ๋‚ด์˜ ion-img ๋Š” ์›น ์ž‘์—…์ž์—์„œ img ๋ฅผ ๋กœ๋“œํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ œ๋ชฉ์— ์žˆ์Šต๋‹ˆ๋‹ค.

ion-img ๋ฅผ img ๋กœ ๋ฐ”๊ฟจ๊ณ  ๊ฐ€์ƒ ์Šคํฌ๋กค ๋‚ด์—์„œ ion-img ๋Œ€์‹  img ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ ion-img ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( https://ionicframework.com/docs/api/components/virtual-scroll/VirtualScroll/ ์ฐธ์กฐ).

๋”ฐ๋ผ์„œ $# ion-img img ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์˜๊ตฌ์ ์ธ ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์—†์œผ๋ฉฐ ์ด ์˜ค๋žœ ๋ฒ„๊ทธ๊ฐ€ ๊ณง ์ˆ˜์ •๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@manucorporat ์•„์ง ์ด ๋ฌธ์ œ์— ์ง„์ „์ด ์—†์Šต๋‹ˆ๊นŒ?

+1

๋‚˜๋Š” ๋˜ํ•œ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋ฒ„๊ทธ๋Š” ion-img์—์„œ img::top ๋ฐ img::bottom ์˜ ๊ณ„์‚ฐ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์Šคํฌ๋กคํ•˜๋Š” ๋™์•ˆ ion-img $์— ๋Œ€ํ•ด $ Content::updateImgs ํ”Œ๋ž˜๊ทธ canRequest ๋ฐ canRender ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๋‚ด ์ฒซ ๋ฒˆ์งธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ฐ€์ƒ ๋ชฉ๋ก์— ๋Œ€ํ•ด ion-img ๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

import {Component, ElementRef, Renderer, Optional} from "@angular/core";
import {Img, Platform, DomController, Content} from "ionic-angular";

@Component({
  selector: 'virtual-ion-img',
  template: '<img>'
})
export class VirtualIonImg extends Img {
  constructor(private __elementRef: ElementRef,
              __renderer: Renderer,
              __plt: Platform,
              @Optional() private __content: Content,
              __dom: DomController) {
    super(__elementRef, __renderer, __plt, __content, __dom);
  }

  get top(){
    this._rect = (<HTMLElement>this.__elementRef.nativeElement).getBoundingClientRect();
    return this._rect.top + this.__content.scrollTop - this.__content._cTop;
  }
  get bottom(){
    this._rect = (<HTMLElement>this.__elementRef.nativeElement).getBoundingClientRect();
    return this._rect.bottom + this.__content.scrollTop - this.__content._cTop;
  }
}

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ํŽ˜์ด์ง€์—์„œ ์ด ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ Content::imgsUpdate ์˜ ๊ณ„์‚ฐ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

import {updateImgs} from "ionic-angular/components/content/content";
import {Component, ViewChild} from "@angular/core";
import {Content} from "ionic-angular";

@Component({
  templateUrl: 'virtual-list.html',
})
export class VirtualListPage {
  @ViewChild(Content) _content: Content;
  ngAfterViewInit(){
    if(this._content) {
      this._content.imgsUpdate = () => {
        if (this._content._scroll.initialized && this._content._imgs.length && this._content.isImgsUpdatable()) {
          // reset cached bounds
          this._content._imgs.forEach((img:Img)=>img._rect = null);
          // use global position to calculate if an img is in the viewable area
          updateImgs(this._content._imgs, this._content._cTop * -1, this._content.contentHeight, this._content.directionY, 1400, 400);
        }
      };
    }
  }
}

DavidWiesner ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค
๋‚˜๋Š” ์ด์˜จ ๋ฐ ๊ฐ๋„๊ฐ€ ์ฒ˜์Œ์ž…๋‹ˆ๋‹ค (์ด์˜จ ํ…Œ์ŠคํŠธ ๋Œ€ ์‹ค์ œ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ˜์‘ ํ…Œ์ŠคํŠธ)

์–ด๋–ค ํŒŒ์ผ์—์„œ ์ด๊ฒƒ์„ ์ง€๋‚˜์ณ์•ผ ํ•ฉ๋‹ˆ๊นŒ? app.components.ts์—์„œ?

@DavidWiesner , ์†”๋ฃจ์…˜์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” updateImgs() ํ•จ์ˆ˜์— ๋ถ™์–ด์žˆ๋‹ค

@alainib

์ฒซ ๋ฒˆ์งธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์œ„ํ•ด

src/app/app.module.ts์— ๋“ฑ๋กํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค src/components/virtual-ion-img.ts์™€ ๊ฐ™์€ ์ƒˆ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

import {VirtualIonImg} from "../components/virtual-ion-img";
...
@NgModule({
    declarations: [
        //... all other pages and components,
        VirtualIonImg
    ],
//... all other stuff e.g.: imports, providers
    entryComponents: [
        //... other pages and components,
        VirtualIonImg
    ]
})

http://ionicframework.com/docs/api/components/virtual-scroll/VirtualScroll/#images -within-virtual์— ์„ค๋ช…๋œ ๋Œ€๋กœ <ion-img> ๋Œ€์‹  <virtual-ion-img [src]="url"></virtual-ion-img> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -์Šคํฌ๋กค

๋‘ ๋ฒˆ์งธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์œ„ํ•ด

๋‚ด๋ถ€์— ๊ฐ€์ƒ ์Šคํฌ๋กค์ด ์žˆ๋Š” typescript ํŽ˜์ด์ง€ ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๊ธฐ, ViewChild ํ•ญ๋ชฉ ๋ฐ ngAfterViewInit ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@kabus202 ๋Œ“๊ธ€์„ ์ˆ˜์ •ํ•˜๊ณ  ๋ˆ„๋ฝ๋œ import ๋ฌธ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. updateImgs ํ•จ์ˆ˜๋Š” ionic angular ์ฝ˜ํ…์ธ  ํŒจํ‚ค์ง€์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@DavidWiesner ์ฒซ ๋ฒˆ์งธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋กœ๋“œ๋˜์ง€ ์•Š๋Š” ์ด๋ฏธ์ง€ ๋Œ€์‹  ์˜ค๋ž˜๋œ ์ด๋ฏธ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

@DavidWiesner : ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ท€ํ•˜์˜ ์ฒซ ๋ฒˆ์งธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ €์—๊ฒŒ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ œ๊ฐ€ ๋ฏธ์นœ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ VirtualScroll์ด ์‹ค์ œ๋กœ ๊ณ ์žฅ๋‚ฌ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹ ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•œ ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์˜ˆ์—์„œ). ์ด์ œ ์‹ค์ œ ์•ฑ์—์„œ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ Ionic _Img_ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด pull ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@DavidWiesner ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (์ €๋Š” ์ฒ˜์Œ์ด๊ณ  ๋™์‹œ์— react/ionic/nativscript๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค)

์ด๊ฒƒ์ด ์ œ๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค :

app.module.ts

import { NgModule, ErrorHandler } from '@angular/core';
import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';
import { MyApp } from './app.component';
import { AboutPage } from '../pages/about/about';
import { ContactPage } from '../pages/contact/contact';
import { HomePage } from '../pages/home/home';
import { TabsPage } from '../pages/tabs/tabs';
import {VirtualIonImg} from "../components/virtual-ion-img";


@NgModule({
  declarations: [
    MyApp,      AboutPage,      ContactPage,        HomePage,       TabsPage
    VirtualIonImg
  ],
  imports: [
    IonicModule.forRoot(MyApp)
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,  AboutPage,      ContactPage,    HomePage,TabsPage
    VirtualIonImg
  ],
  providers: [{provide: ErrorHandler, useClass: IonicErrorHandler}]
})
export class AppModule {}

๊ฐ€์ƒ ์ด์˜จ img.ts

import {Component, ElementRef, Renderer, Optional} from "@angular/core";
import {Img, Platform, DomController, Content} from "ionic-angular";

@Component({
  selector: 'virtual-ion-img',
  template: '<img>'
})
export class VirtualIonImg extends Img {
  constructor(private __elementRef: ElementRef,
              __renderer: Renderer,
              __plt: Platform,
              @Optional() private __content: Content,
              __dom: DomController) {
    super(__elementRef, __renderer, __plt, __content, __dom);
  }

  get top(){
    this._rect = (<HTMLElement>this.__elementRef.nativeElement).getBoundingClientRect();
    return this._rect.top + this.__content.scrollTop - this.__content._cTop;
  }
  get bottom(){
    this._rect = (<HTMLElement>this.__elementRef.nativeElement).getBoundingClientRect();
    return this._rect.bottom + this.__content.scrollTop - this.__content._cTop;
  }
}

๋‚ด ๊ฒฌํ•ด

<ion-content padding>
  <h2>Ionic List items</h2>
    <ion-list [virtualScroll]="items">
        <ion-item *virtualItem="let item">
            {{ item.i }}
            <virtual-ion-img [src]="item.src"
                 alt="item.image"  height="200" width="300" >
            </virtual-ion-img>
        </ion-item>
    </ion-list>

  FIN
</ion-content>

๋‚˜๋Š”์ด ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค :

[WARN] Error occurred during command execution from a CLI plugin (@ionic/cli-plugin-cordova). Your plugins may be out of
       date.
Error: Template parse errors:
Can't bind to 'src' since it isn't a known property of 'virtual-ion-img'.
1. If 'virtual-ion-img' is an Angular component and it has 'src' input, then verify that it is part of this module.
2. If 'virtual-ion-img' is a Web Component then add "CUSTOM_ELEMENTS_SCHEMA" to the '@NgModule.schemas' of this componen
t to suppress this message.
 ("
        {{ item.i }}

        <virtual-ion-img [ERROR ->][src]="item.src"
             alt="item.image"  height="200" width="300" >
                </virtual-ion-img>
"): HomePage<strong i="19">@16</strong>:25

๋‚ด๊ฐ€ ๋ฌด์—‡์„ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@alainib src="item.src [src]="item.src" ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์นด๋ฒ„์Šค202 . ๋„์™€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ป๋Š” ์˜ค๋ฅ˜๋Š” [src]์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž˜๋ชป๋œ html ์ฝ”๋“œ๋ฅผ ๋ถ™์—ฌ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.)

'rc'๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

typescript: ..._amap/react-native-compare-ionic2-master/ionic/src/components/virtual-ion-img.ts, line: 14
Supplied parameters do not match any signature of call target.

            __dom: DomController) {
  super(__elementRef, __renderer, __plt, __content, __dom);

ngc failed: Failed to transpile TypeScript

@alainib ์–ด๋–ค ๋ฒ„์ „์˜ ionic์„ ์‚ฌ์šฉํ•˜์‹ญ๋‹ˆ๊นŒ? 3.2์—์„œ Img ์˜ ์ƒ์„ฑ์ž๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Ionic 3.2 ์ด์ „์—๋Š” ์ƒ์„ฑ์ž์— ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ NgZone์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

VirtualIonImg ์ด์ „ Ionic 3.2

import {Component, ElementRef, Renderer, Optional, NgZone} from "@angular/core";
import {Img, Platform, DomController, Content} from "ionic-angular";

@Component({
  selector: 'virtual-ion-img',
  template: '<img>'
})
export class VirtualIonImg extends Img {
  constructor(private __elementRef: ElementRef,
              __renderer: Renderer,
              __plt: Platform, 
              __zone: NgZone,
              @Optional() private __content: Content,
              __dom: DomController) {
    super(__elementRef, __renderer, __plt, __zone, __content, __dom);
  }

  get top(){
    this._rect = (<HTMLElement>this.__elementRef.nativeElement).getBoundingClientRect();
    return this._rect.top + this.__content.scrollTop - this.__content._cTop;
  }
  get bottom(){
    this._rect = (<HTMLElement>this.__elementRef.nativeElement).getBoundingClientRect();
    return this._rect.bottom + this.__content.scrollTop - this.__content._cTop;
  }
}

6๊ฐœ์›”์ด ์ง€๋‚ฌ๋Š”๋ฐ ์™œ ์•ˆ ๊ณ ์ณ์กŒ์ง€?

@WangRongda ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์Šน์ธ๋˜์–ด์•ผ ํ•˜๋Š” PR์„ ์ œ์ถœํ•˜์…จ์Šต๋‹ˆ๊นŒ?

@janpio ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ์ง€๊ธˆ์€ ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ion-img๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์•„ ๋ฉฐ์น  ๊ณ ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์›๊ฒฉ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋Š” ~200๊ฐœ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๋ชฉ๋ก์—์„œ ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์Šคํฌ๋žจ๋ธ”๋ฉ๋‹ˆ๋‹ค(์ด์ „ ํ•ญ๋ชฉ์˜ ์ด๋ฏธ์ง€๊ฐ€ ํ˜„์žฌ ํ•ญ๋ชฉ์— ์žˆ์Œ). ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? virtual-ion-img๋กœ ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@dspachos ๋Š” ionic ํŒ€์ด ๊ฐ€์ƒ ์Šคํฌ๋กค ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ํ˜„์žฌ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌดํ•œ ์Šคํฌ๋กค์„ ๋Œ€์‹  ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•œ ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

@JustasKuizinas ๊ทธ๋Ÿฌ๋‚˜ infinite-scroll ๋Š” ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋ชจ๋“  ํ•ญ๋ชฉ์€ DOM์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํŠนํžˆ iOS์—์„œ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ionic1.x์—์„œ๋„ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค ๋ชจ๋‘๊ฐ€ ionic2 ๋˜๋Š” 3์— ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ํ•ด๊ฒฐ์ฑ…์ด ์—†์Šต๋‹ˆ๋‹ค.

@vahidvdn ์†”๋ฃจ์…˜์€ ์•„๋‹ˆ์ง€๋งŒ ionic ํŒ€ ์ž์ฒด๊ฐ€ ๊ฐ€์ƒ ์Šคํฌ๋กค์ด ์ˆ˜์ •๋  ๋•Œ๊นŒ์ง€ ์ง€๊ธˆ ๋‹น์žฅ์€ ์ตœ์„ ์˜ ์„ ํƒ์ด๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. :)

@JustasKuizinas ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ vs-repeat (angularjs ๋ฐ angular ๋ชจ๋‘์— ๋Œ€ํ•ด)๋ผ๋Š” ์ข‹์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. angularjs๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •๋ง ๊ต‰์žฅํ•˜์ง€๋งŒ iOS์—์„œ ์Šคํฌ๋กคํ•˜๋Š” ๋™์•ˆ ๋งŽ์€ ์ง€์—ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ionic ํŒ€์˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ virtualScroll์€ ์‹ค์ œ ์•ฑ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

@vahidvdn ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์•ฑ์€ Ionic์„ ์‚ฌ์šฉํ•˜์—ฌ ์™„์„ฑํ•˜์ง€๋งŒ ๋‹ค์Œ ์•ฑ์—์„œ๋Š” ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ(React Native ๋˜๋Š” Native ์Šคํฌ๋ฆฝํŠธ)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. Ionic ํŒ€์€ ํ›Œ๋ฅญํ•œ ์ผ์„ ํ•˜๊ณ  ์žˆ์ง€๋งŒ ํ”„๋ ˆ์ž„์›Œํฌ์— ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์•ฑ์—์„œ ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋œ ์ตœ๋Œ€ 50๊ฐœ ํ•ญ๋ชฉ์˜ ์ •์  ๋ชฉ๋ก(๊ฐ€์ƒ ์Šคํฌ๋กค ๋ฒ„๊ทธ๋กœ ์ธํ•ด)์œผ๋กœ ๋๋‚ฌ๊ณ  ๋’ค๋กœ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ง€์—ฐ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ ๋™์ž‘์ธ popView๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค). ๋‚ด ๋ชฉ๋ก์— 15-20๊ฐœ์˜ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ์ด ์ง€์—ฐ์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋”์šฑ์ด iOS์—์„œ๋Š” ๊ธฐ๊ธฐ๊ฐ€ ๋ฐฐํ„ฐ๋ฆฌ ์ ˆ์•ฝ ๋ชจ๋“œ์— ์žˆ์„ ๋•Œ(๊ทธ๋ฆฌ๊ณ  CPU๊ฐ€ ์•„๋งˆ๋„ ์†๋„๋ฅผ ๋Šฆ์ถ”๊ณ  ์žˆ์„ ๋•Œ) ์„ฑ๋Šฅ์ด ํ›จ์”ฌ ๋” ๋‚˜๋น ์ ธ ๊ฑฐ์˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@dspachos ๋ช‡ ๋‹ฌ ์ „์—๋„ ์˜ค ๊ฐ€์ƒ ์Šคํฌ๋กค์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์—ฌ ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ตœ์šฐ์„ ์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ์Šคํฌ๋ฆฝํŠธ ๋Œ€์‹  ionic์„ ์„ ํƒํ–ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์†์ƒ๋˜๊ณ  ์ง€์—ฐ ์—†๋Š” ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์—†๋‹ค๋Š” ์†Œ์‹์„ ๋“ฃ๊ฒŒ ๋˜์–ด ์Šฌํ”•๋‹ˆ๋‹ค. ๋ฐฉ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๋ชฉ๋ก.

์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๋‚ด ๋ชฉ๋ก์— 150๊ฐœ ๋ฏธ๋งŒ์˜ ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ion-img img ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ–ˆ๊ณ  ์„ฑ๋Šฅ ์†์‹ค ์—†์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ion-img ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ์žƒ์—ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๋ชจ๋“  ๋ชฉ๋ก์— ์ด ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@diegomachado1 ์ด๋ฏธ์ง€๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ์žˆ์Šต๋‹ˆ๊นŒ? ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์†๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ•˜์‹ญ์‹œ์˜ค. ์ผ๋ถ€ ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š์œผ๋ฉด ์ด์ „ ์ด๋ฏธ์ง€๊ฐ€ ์ œ์ž๋ฆฌ์— ์™€์„œ ์„œ๋กœ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

2017-08-16 ๋ฐ ionic 3.6 ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
์ œ ๊ฒฝ์šฐ์—๋Š” ๋‘ ๋ฒˆ์งธ ์ˆ˜์ • ์‚ฌํ•ญ(์ƒ๋‹จ์— ๊ฒŒ์‹œ๋จ)์„ ์ ์šฉํ•˜๊ณ  ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@decpio ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ํ–ˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

ํ™•์ธ,

๊นจ์ง„ ํŽ˜์ด์ง€์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
'@angular/core'์—์„œ { Component, ViewChild } ๊ฐ€์ ธ์˜ค๊ธฐ;
'ionic-angular/components/content/content'์—์„œ { updateImgs } ๊ฐ€์ ธ์˜ค๊ธฐ;
'ionic-angular/components/img/img-interface'์—์„œ { Img } ๊ฐ€์ ธ์˜ค๊ธฐ;
'ionic-angular'์—์„œ { ์ฝ˜ํ…์ธ  } ๊ฐ€์ ธ์˜ค๊ธฐ;

/* 2017-08-16 - add this to class body
    start FIX#9660 ion-img doesn't correctly work with virtualScroll
    https://github.com/ionic-team/ionic/issues/9660#issuecomment-304840427
*/
@ViewChild(Content) _content: Content;
ngAfterViewInit() {
    if (this._content) {
        this._content.imgsUpdate = () => {
            if (this._content._scroll.initialized && this._content._imgs.length && this._content.isImgsUpdatable()) {
                // reset cached bounds
                this._content._imgs.forEach((img: Img) => (<any>img)._rect = null);
                // use global position to calculate if an img is in the viewable area
                updateImgs(this._content._imgs, this._content._cTop * -1, this._content.contentHeight, this._content.directionY, 1400, 400);
            }
        };
    }
}
/*
end FIX#9660
*/

๊ทธ๊ฒŒ ๋‹ค์•ผ - ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
๋‚ด ๊นจ์ง„ ํŽ˜์ด์ง€:













<ion-content padding> <ion-grid [virtualScroll]="__items" [bufferRatio]="2" approxItemHeight="80px" approxItemWidth="100%" [virtualTrackBy]="ItemComparer"> <div *virtualItem="let item"> <ion-row align-items-center justify-content-center> <ion-col col-auto> <ion-item> <ion-thumbnail item-start> <ion-img [src]="'my-personalized-url?item='+item?.item"></ion-img> </ion-thumbnail> </ion-item> </ion-col> </ion-row> </ion-grid>

@DavidWiesner ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ €๋Š” Ionic-Angular 3.6.0(์ด ๊ธ€์„ ์“ฐ๋Š” ์‹œ์ ์—์„œ ์ตœ์‹  ๋ฒ„์ „)์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

2๋ฒˆ๋„ ์•„์ฃผ ์ž˜์“ฐ๊ณ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋„ˆ๋น„์™€ ๋†’์ด ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋งจ ์•„๋ž˜ ํ•ญ๋ชฉ์ด ์œ„ ํ•ญ๋ชฉ๊ณผ ๊ฒน์น˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•˜๋ฉด ๊ฒน์น˜๋Š” ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋ทฐํฌํŠธ์—์„œ ์‚ฌ๋ผ์ง„ ์ด์ „ ํ•ญ๋ชฉ์ด ๊ฒน์น˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํ•ญ๋ชฉ์ด ๋ทฐํฌํŠธ์— ์žˆ๊ณ  ์ด๋ฏธ์ง€๊ฐ€ ๋‹ค์‹œ ๋กœ๋“œ๋˜๋ฉด ํ•ด๋‹น ๋ฐฐ์น˜์—์„œ ๊ฒน์น˜๋Š” ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ.

@decpio ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์€ ์ €์—๊ฒŒ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋กค์ด ๋„๋‹ฌํ•˜์ง€ ์•Š๋Š” ํ•œ ์ด๋ฏธ์ง€๋Š” "์–ธ๋กœ๋“œ" ์ƒํƒœ๋กœ ์œ ์ง€๋˜์ง€๋งŒ ๋กœ๋“œ๋˜์–ด์•ผ ํ•  ๋•Œ ๋กœ๋“œ๋˜๊ณ  ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!!!

ํ•œ ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์€ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋œ ํ›„ ํ™”๋ฉด/์ฐฝ/ํ”„๋ ˆ์ž„ ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ init ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š” ํ•ญ๋ชฉ ์ˆ˜์— ๋Œ€ํ•ด์„œ๋งŒ ๋ ˆ์ด์Šค ๋กœ๋“œ๊ฐ€ ๊ณ„์† ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ด๋ฏธ ์›์  ๋™์ž‘์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ฉ๋‹ˆ๋‹ค @DavidWiesner & @decpio ๋‘ ๋ฒˆ์งธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ Ionic 3.7.1์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ Ionic 3.8์˜ ๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. @manucorporat @adamdbradley๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ 
์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ชจ๋“  VS ์‚ฌ์šฉ์— ์ •๋ง ๋‚˜์œ ๊ฒƒ์ž…๋‹ˆ๋‹ค ...
@masimplo ํ™•์ธํ•ด๋ณด์‹ค๋ž˜์š”? https://github.com/ionic-team/ionic/pull/12917 ์— ๋Œ€ํ•œ ๋ฉ‹์ง„ ์ž‘์—…์„ ๋งˆ์นœ ํ›„ VS์— ๋›ฐ์–ด๋“ค ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ด ํ™•์‹คํžˆ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค... ๐Ÿ™‰

์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ iOS9์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. iOS10 ๋ฐ iOS11์—์„œ๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

@HugoHeneault , @manucorporat , @adamdbradley : ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ Ionic์— ๋ณ‘ํ•ฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค(ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์˜ ์ž‘์„ฑ์ž๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ•จ). ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ํŒจ์น˜๊ฐ€ ์—†๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” Ionic ํŒ€์ด virtualscroll์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 3.8 ๋ณ€๊ฒฝ ๋กœ๊ทธ์— "๊ฐ€์ƒ ์Šคํฌ๋กค: ๊นœ๋ฐ•์ž„ ๋ฌธ์ œ ์ˆ˜์ •"์ด๋ผ๋Š” ํ•ญ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ „ํ˜€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๊นœ๋ฐ•์ด๋Š” ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@nicolus Ionic ํŒ€์ด virtualscroll/ion-img๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  virtualscroll์ด ion-refresh์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. @Apink_2020 @sun_sssssssss @_aaaaaaaaaaa

@HugoHeneault ์ €๋Š” ion-img๋กœ ์ „ํ˜€ ์ž‘์—…ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋žฌ์–ด์•ผ ํ–ˆ๋Š”๋ฐ ์•ˆ ํ–ˆ์–ด. ๋ณผ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๊ณ ์žฅ๋‚œ ๊ฒƒ์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ๋กœ๊ทธ์˜ @nicolus ํ•ญ๋ชฉ์€ ๊ฐ€์ƒ ์Šคํฌ๋กค์˜ ํšŒ๊ท€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ง์ ‘ ์ œ์ถœํ•œ PR์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ขŒ์ ˆ์„ ์ดํ•ดํ•˜์ง€๋งŒ, ๊ทธ PR์€ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์„ธํŠธ๊ฐ€ ์ž์ฃผ ์—…๋ฐ์ดํŠธ๋  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“œ๋Š” VS์˜ ํŠน์ • ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์œผ๋ฉฐ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์™„์ „ํ•œ ์žฌ์ž‘์„ฑ์€ ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋„ VS๊ฐ€ ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ด€์‹ฌ์„ ํ•„์š”๋กœ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ฐ€์ƒ ์Šคํฌ๋กค์€ ์• ์ดˆ์— ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทน์†Œ์ˆ˜์˜ ํ”„๋ ˆ์ž„์›Œํฌ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํŠน์ • ์ œํ•œ์„ ๋‘๊ณ  ์„ฑ๊ณต์ ์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. Ionic VS๋Š” ๋ชจ๋“  ๊ฒƒ, ๊ฐ€๋ณ€ ํ•ญ๋ชฉ ํฌ๊ธฐ, ๋‹ค์ค‘ ์—ด, ํ•ญ๋ชฉ๋‹น ๋จธ๋ฆฌ๊ธ€/๋ฐ”๋‹ฅ๊ธ€, ์ด๋ฏธ์ง€, ํฌ๊ธฐ ์กฐ์ • ๋“ฑ์„ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๊ตฌํ˜„์€ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ด€๋ จ์ด ์—†๋Š” ๋งŽ์€ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฆฌํŒฉํ† ๋ง ์ฃผ๊ธฐ๋ฅผ ๊ฑฐ์ณค์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ 2๋ฒˆ ํ•ญ๋ชฉ ์ฐธ์กฐ)
  2. ์ด์˜จ ๊ฐ€์ƒ ์Šคํฌ๋กค์€ ๋งŽ์€ ์ด์˜จ ๊ตฌ์„ฑ ์š”์†Œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋ฅผ ์œ„ํ•œ Ion-img, ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•œ ๋ฌดํ•œ ์Šคํฌ๋กค, ์Šคํฌ๋กค์„ ์œ„ํ•œ ์ฝ˜ํ…์ธ  ๋“ฑ. ๋˜ํ•œ ์ด์˜จ ์š”์†Œ ion-item, ion-card ๋“ฑ๊ณผ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ๋„ ์š”์†Œ๋ฅผ ๋ชจ๋‘ ๋ Œ๋”๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ณต์žก์„ฑ์€ PR์ด ์ฒ˜๋ฆฌํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ปค์„œ ๊ฐ€์ƒ ์Šคํฌ๋กค์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…(์ด๋Š” ์ด์˜จ ํŒ€์˜ ๋ชฉํ‘œ์™€ ์ผ์น˜ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•จ), ์ˆ˜ํ–‰ ๋ฐฉ๋ฒ• ๋ฐ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์žฌ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ionic v4๋กœ ์ด๋™ํ•˜๋ฉด ํด๋ฆฌ๋จธ์˜ ์ฒ  ๋ชฉ๋ก์ด ์˜ค๋Š˜๋‚ ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌํ˜„์€ ํ”„๋กœ์ ํŠธ์—์„œ v4 ๋ฆด๋ฆฌ์Šค ์ดํ›„ ionic ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์‹ค์งˆ์ ์ธ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ € ์—ญ์‹œ ๊ฐ€์ƒ ์Šคํฌ๋กค ์—†์ด๋Š” ์‹ค์ œ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ์žˆ์–ด ๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ฒฝ์Ÿํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ† ๋ผ ๊ตฌ๋ฉ์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ์˜ต์…˜์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@masimplo : ๋งž์Šต๋‹ˆ๋‹ค. ๊ฐ€์ƒ ์Šคํฌ๋กค์ด ion-img ์ด์ƒ์˜ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค(๊ฐœ์ธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์šฉ๋„์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).
์ด ํŠน์ • ๋ฒ„๊ทธ ์ˆ˜์ •์„ ๋น„ํŒํ•˜๋ ค๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ํŒ€์—์„œ ๋” ๋งŽ์€ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋น ๋ฅธ ์ˆ˜์ •์„ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์†Œ์‹์ด ์žˆ๋‚˜์š”? ์ด๊ฑฐ ํŒ€์—์„œ ์กฐ์‚ฌํ•˜๋‚˜์š”?

๋‚˜๋„ ์ˆ˜์ • ๋ฐ”๋ž๋‹ˆ๋‹ค

@RafaelKr @fdambrosio v4๊ฐ€ ์ถœ์‹œ๋˜๊ธฐ ์ „์— ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ˆ˜์ •์„ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ionic3๋กœ ์ž‘์—…ํ•˜๋Š” ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์Šค์Šค๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์œ ๋กญ๊ฒŒ ์ˆ˜์ •ํ•˜๊ณ  PR์„ ์ž‘์„ฑํ•˜์„ธ์š” ;)

+1

์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค
html <ion-img [src]="image.url" [alt]="image.alt">

์—ฌ์ „ํžˆ ์ˆ˜์ •์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ...

ionic v4๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@miqmago : ์ถ”๊ฐ€ ์ •๋ณด๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฝ์–ด์ฃผ์„ธ์š”:
https://blog.ionicframework.com/whats-the-issue-with-issues/

https://github.com/ionic-team/ionic/issues/9660#issuecomment -307314053 ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค

์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.[virtualScroll] ๋‚ด๋ถ€์—์„œ ์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ•ฉ๋‹ˆ๊นŒ?

ionic v4๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Ionic 4์—์„œ ์ˆ˜์ •๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ๋Š” ๊ฒƒ์€ ์–ด๋ฆฌ์„์€ ์ผ์ž…๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด ๋ฒ„๊ทธ๊ฐ€ ์žˆ์ง€๋งŒ ํŒ€์€ Ionic 5, 6์— ์ค‘์ ์„ ๋‘๊ณ  ๊ฐ๊ฐ์˜ ์ƒˆ ๋ฒ„์ „์— ๋Œ€ํ•ด ๋งŽ์€ ๋ฒ„๊ทธ๋ฅผ ๋‚จ๊น๋‹ˆ๋‹ค.
React ์ธก๋ฉด์—์„œ ๊ฐ ๋ฒ„์ „์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊นจ๋œจ๋ฆด ์œ„ํ—˜์ด ์žˆ์ง€๋งŒ ์ ์–ด๋„ ์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์„ ๊ธฐ๋Œ€ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
Ionic์— ๋งค์šฐ ์‹ค๋งํ–ˆ์Šต๋‹ˆ๋‹ค... ๋ฒ„๊ทธ๋ฅผ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๋Œ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜์ •ํ•˜๋„๋ก ๋†”๋‘๋Š” ๊ฒƒ์€ ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@mopi1402 ๊ณผ๊ฑฐ์— ionic ํŒ€์—์„œ ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•œ ๋ฐฉ์‹์ด ์ข‹์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ํ–ฅํ›„ ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ์„ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
https://blog.ionicframework.com/whats-the-issue-with-issues/
https://blog.ionicframework.com/ionic-semantic-versioning-release-schedule-and-lts/

ionic ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์˜คํ”ˆ ์†Œ์Šค์ด๋ฉฐ ๋ˆ„๊ตฌ๋‚˜ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ๋„์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. :)

@mopi1402 Angular ๊ฐœ๋ฐœ์ž๋ผ๋ฉด react-native ๋Œ€์‹  Nativescript๋ฅผ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐ˜์‘๋ณด๋‹ค ๋‚˜์€ ์ด์œ ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mopi1402 ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์•„์ง v4 ๋ฒ ํƒ€์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Ionic 4์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Ionic์€ ์˜คํ”ˆ ์†Œ์Šค ์†Œํ”„ํŠธ์›จ์–ด์ž…๋‹ˆ๋‹ค. ๋นจ๋ฆฌ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํŒจ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  PR์„ ์ œ์ถœํ•˜์„ธ์š” ๐Ÿ‘

@HugoHeneault : ๋‚ด ํ”„๋กœ ๊ตฌ๋…์„ ํ†ตํ•ด ํ•œ ๋‹ฌ์— 29๋‹ฌ๋Ÿฌ๋ฅผ ์ง€๋ถˆํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ์†Œํ”„ํŠธ์›จ์–ด์ž…๋‹ˆ๋‹ค(ํ”„๋ ˆ์ž„์›Œํฌ ์ž์ฒด๋Š” ๋ฌด๋ฃŒ์ง€๋งŒ ๋น„์˜๋ฆฌ ์กฐ์ง์ด ์•„๋‹ˆ๋ผ ๊ตฌ๋…๋ฃŒ), ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋ฌด๋ฃŒ๋กœ ๊ทธ๊ฒƒ์„ ์Šค์Šค๋กœ ๊ณ ์น  ํ•„์š”๊ฐ€ ์—†์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ •ํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ์ด๊ณ  ionic 4๊ฐ€ ์•„์ง ๋ฒ ํƒ€ ๋ฒ„์ „์ด๋ฉฐ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค... ์ด ๋ชจ๋“  ๊ฒƒ์ด ์™„๋ฒฝํ•˜๊ฒŒ ํƒ€๋‹นํ•œ ์ด์œ ์ด์ง€๋งŒ "OSS๊ฐ€ ์Šค์Šค๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค lol"์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@nicolus ๋‹น์‹  ๋ง์ด ์˜ณ์•˜๊ณ , ๋‚ด๊ฐ€ ์ง€๋ถˆํ•œ ์„œ๋น„์Šค๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๋•Œ๋„ ๋ถˆํ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” Ionic ํšŒ์‚ฌ๊ฐ€ ํ”„๋ฆฌ๋ฏธ์—„ ์„œ๋น„์Šค๋กœ ๋ˆ์„ ๋ฒŒ๊ณ  ์žˆ๋‹ค๊ณ  ํ•ด๋„ ํŒ€์˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŽ์€ ์ผ์„ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ˆ„๊ตฌ๋‚˜ ์ง€๋ถˆํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌด๋ฃŒ ๋„๊ตฌ๋ฅผ ์œ„ํ•ด ์ƒ๊ณ„๋ฅผ ๊พธ๋ ค์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ €์—๊ฒŒ๋Š” OSS๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค ๋น„์šฉ์„ ์ง€๋ถˆํ•  ์˜๋ฌด๊ฐ€ ์—†์œผ๋ฉฐ ํ•œ ํ‘ผ๋„ ์ฃผ์ง€ ์•Š๊ณ  ๋ฉ‹์ง„ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋“ค์€ ๋‹น์‹ ์˜ ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ๋งŽ์€ ํ”„๋กœ ๊ตฌ๋…์— ๋Œ€ํ•ด ๋น„์šฉ์„ ์ง€๋ถˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ๋ฉฐ์น ์„ ์†Œ๋น„ํ•˜์ง€ ์•Š๊ณ  ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•  ๋•Œ ๋„์›€์„ ์ค„ ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” Ionic 3 ๋ฌธ์ œ๋กœ ์ž๋™ ์‹๋ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— Ionic 3๋ฅผ ์ž์ฒด ์ €์žฅ์†Œ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ Ionic 3์šฉ ์ €์žฅ์†Œ๋กœ ์˜ฎ๊ธฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ์ถ”์ ํ•˜์‹ญ์‹œ์˜ค.

์ œ๊ฐ€ ์‹ค์ˆ˜๋ฅผ ํ–ˆ๊ณ  ์ด ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ Ionic 4์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๋ฉด Ionic Framework ํŒ€์— ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค!

์•„์ด์˜ค๋‹‰์„ ์ด์šฉํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋ฌธ์ œ ์ด๋™: https://github.com/ionic-team/ionic-v3/issues/148

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰