Ngx-drag-scroll: 질문: ng-bootstrap의 νƒ­μ…‹κ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

에 λ§Œλ“  2017λ…„ 06μ›” 19일  Β·  17μ½”λ©˜νŠΈ  Β·  좜처: bfwg/ngx-drag-scroll

μ•ˆλ…•ν•˜μ„Έμš”, 방금 Googleμ—μ„œ 이 ν”ŒλŸ¬κ·ΈμΈμ„ μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

맀우 κΈ΄ μ‚¬μ΄νŠΈ 탐색 메뉴에 정말 μœ μš©ν•˜λ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ©”λ‰΄λŠ” ngb-tabset(ng-bootstrap의 ꡬ성 μš”μ†Œ 쀑 ν•˜λ‚˜)으둜 κ΅¬μΆ•λ˜μ—ˆμœΌλ©° ν”ŒλŸ¬κ·ΈμΈμ„ tabset ꡬ성 μš”μ†Œμ— μ‚½μž…ν•˜λŠ” 방법을 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

쑰언을 ν•΄μ£Όμ‹œλ©΄ 정말 쒋을 것 κ°™μ•„μš”! 정말 κ°μ‚¬ν•©λ‹ˆλ‹€!

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

@tommykamkcmλ‹˜ , μ•ˆλ…•ν•˜μ„Έμš”. μ œκ°€ λ„μšΈ 수 μžˆλŠ” λͺ¨λ“  일을 ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. κ·€ν•˜μ˜ μ½”λ“œλ₯Ό μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

λΉ λ₯Έ 응닡에 κ°μ‚¬ν•©λ‹ˆλ‹€! μš°μ„ , μ €λŠ” Angular1에 λŒ€ν•œ μ•½κ°„μ˜ κ²½ν—˜λ§Œ 있고 Angular2에 λŒ€ν•œ μ΄ˆλ³΄μžμž…λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‚΄κ°€ν•˜λ €λŠ” 일이 κ°€λŠ₯ν•œμ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ•„λž˜λŠ” ng-bootstrap의 Tabset ꡬ성 μš”μ†Œλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ HTML μ½”λ“œμž…λ‹ˆλ‹€. https://ng-bootstrap.github.io/#/components/tabs

<ngb-tabset>
    <ngb-tab *ngFor="let group of groups" [id]="group.id">
        <template ngbTabTitle>{{group.name}}</template>
        <template ngbTabContent>
            ...
        </template>
    </ngb-tab>
</ngb-tabset>

그리고 κ²°κ΅­ λœλ‹€

<ngb-tabset _ngcontent-43="">
   <div class="longTabMenu">
    <ul role="tablist" ng-reflect-class-name="nav nav-tabs justify-content-start" class="nav nav-tabs justify-content-start">
        <li class="nav-item">
            <a href="" role="tab" ng-reflect-ng-style="[object Object]" ng-reflect-id="Themes" id="Themes" ng-reflect-class-name="nav-link nav-link-Themes" class="nav-link nav-link-Themes active" aria-controls="Themes-panel" aria-expanded="true" style="border-color: blanchedalmond;">
                Tab 1
            </a>
        </li>
        ...
        </ul>
    </div> 
    <div class="tab-content">
      ...
    </div>
  </ngb-tabset>

κ·Έλž˜μ„œ λ‚΄κ°€ μ‹œλ„ν•œ 것은 ng-bootstrap.js의 <div class="longTabMenu"> 에 drag-scroll λ₯Ό μΆ”κ°€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
image

그리고 μ˜ˆμƒλŒ€λ‘œ <div class="longTabMenu" drag-scroll ...> κ°€ λ Œλ”λ§λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μž‘λ™ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

첫 번째 μ‹œλ„κ°€ μž‘λ™ν•˜μ§€ μ•ŠλŠ” 것 κ°™μ•„μ„œ 이제 DragScroll ꡬ성 μš”μ†Œλ₯Ό 호슀트 ꡬ성 μš”μ†Œμ˜ ngOnInit / ngAfterViewInit 에 μ‚½μž…ν•˜μ—¬ <div ... > μ—μ„œ DragScroll을 μˆ˜λ™μœΌλ‘œ μ΄ˆκΈ°ν™”ν•  수 μžˆλŠ”μ§€ μƒκ°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
예

@Component({
    selector: 'wd-shows',
    templateUrl: 'app/shows/shows.component.html',
    styleUrls: ['app/shows/shows.component.css'],
    providers: [ShowService, JobService],
})

export class ShowsComponent implements OnInit, AfterViewInit {
...
ngAfterViewInit(): void {
        console.log('AfterViewInit');
        console.log(this.elTablistHolder);
        this.elTablistHolder = this.element.nativeElement.querySelector('.longTabMenu');
        this.renderer.setElementAttribute(this.elTablistHolder, 'drag-scroll', null);
        this.renderer.setElementAttribute(this.elTablistHolder, 'drag-scroll-y-disabled', 'true');
        this.renderer.setElementAttribute(this.elTablistHolder, 'scrollbar-hidden', 'true');
        **// Not sure what's next, still googling**
    }
...
}

μ—¬κΈ°κΉŒμ§€κ°€ λ‚΄κ°€ 가진 λͺ¨λ“  μ •λ³΄μž…λ‹ˆλ‹€. μ‹œκ°„ λ‚΄ μ£Όμ…”μ„œ λŒ€λ‹¨νžˆ κ°μ‚¬ν•©λ‹ˆλ‹€!

μ•ˆλ…•ν•˜μ„Έμš” @bfwg , λ§ˆμΉ¨λ‚΄ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€! 기본적으둜 μˆ˜λ™μœΌλ‘œ

  • APIμ—μ„œ μ‚¬μš© κ°€λŠ₯ν•œ 속성 μ •μ˜
  • ngOnChanges() 호좜
  • renderer.listen() 및 renderer.listenGlobal()을 μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  마우슀 이벀트λ₯Ό λ°”μΈλ”©ν•©λ‹ˆλ‹€.
export class BlahComponent implements OnInit {
...
dragScrollDom: any;
dragScrollRef: ElementRef;
dragScroll: DragScroll;

constructor(...) {}
ngOnInit(): void {
...
        // At the end of the ngOnInit()
        this.dragScrollDom = this.element.nativeElement.querySelector('.longTabMenu');
        this.dragScrollRef = new ElementRef(this.dragScrollDom );
        this.dragScroll = new DragScroll(this.dragScrollRef, this.renderer);
        this.dragScroll.disabled = false;
        this.dragScroll.scrollbarHidden = true;
        this.dragScroll.yDisabled = true;
        this.dragScroll.xDisabled = false;
        this.dragScroll.ngOnChanges();
        this.renderer.listen(this.dragScrollDo , 'mousedown', (event) => {
            this.dragScroll.onMouseDown(event);
        });
        this.renderer.listenGlobal('document', 'mousemove', (event) => {
            this.dragScroll.onMouseMove(event);
        });
        this.renderer.listenGlobal('document', 'mouseup', (event) => {
            this.dragScroll.onMouseUp(event);
        });
}
...
}

λ‚˜λŠ” λ˜ν•œ μ•½κ°„μ˜ μ œμ•ˆμ΄ μžˆμŠ΅λ‹ˆλ‹€(쒋은 생각인지 μ•„λ‹Œμ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŒ): document.addEventListener() & document.removeEventListener() λŒ€μ‹  Angular2의 renderer.listen() & renderer.listenGlobal() μ‚¬μš© document.removeEventListener()
이 변경을 톡해 μ†ŒμŠ€ μ½”λ“œλŠ” 바닐라 JS와 ν˜Όν•©λ˜μ§€ μ•Šκ³  μˆœμˆ˜ν•œ Angular2둜 μž‘μ„±λ  κ²ƒμž…λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ, κ·€ν•˜μ˜ λ…Έλ ₯에 κ°μ‚¬λ“œλ¦¬λ©° 제 발견/μ œμ•ˆμ΄ μœ μš©ν•˜κΈ°λ₯Ό λ°”λžλ‹ˆλ‹€!

@tommykamkcm μ‹ κ³ ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. renderer.listenGlobal() λ₯Ό μ‚¬μš©ν•˜λ„λ‘ 라이브러리λ₯Ό μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ 것을 λ°œκ²¬ν•˜λ©΄ μ•Œλ €μ£Όμ‹­μ‹œμ˜€.

@bfwgλ‹˜ , μ„±κ°€μ‹œκ²Œ ν•΄μ„œ μ£„μ†‘ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ–΄μ œ ν•œ 일이 μ‹€μ œλ‘œ λ‹€λ₯Έ ꡬ성 μš”μ†Œμ— 영ν–₯을 미치고 μžˆλ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. .

λ‚΄κ°€ μ œμ•ˆν•˜λŠ” 것은 μƒμ„±μžμ—μ„œ document el.nativeElement mouseup mousemove λ₯Ό λ°”μΈλ”©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

this.mouseMoveListener = renderer.listen(el.nativeElement, 'mousemove', this.onMouseMoveHandler);
this.mouseUpListener = renderer.listen(el.nativeElement, 'mouseup', this.onMouseUpHandler);

이 μž‘μ—…μ„ μˆ˜ν–‰ν•œ ν›„ μ΄ˆκΈ°ν™”μ—λŠ” 2λ‹¨κ³„λ§Œ ν•„μš”ν•©λ‹ˆλ‹€.

  • APIμ—μ„œ μ‚¬μš© κ°€λŠ₯ν•œ 속성 μ •μ˜
  • ngOnChanges() 호좜
  • ~renderer.listen() 및 renderer.listenGlobal()을 μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  마우슀 이벀트λ₯Ό λ°”μΈλ”©ν•©λ‹ˆλ‹€~

μƒμ„±μž(...) {}
ngOnInit(): 무효 {
...
// ngOnInit() μ’…λ£Œ μ‹œ
this.dragScrollDom = this.element.nativeElement.querySelector('.longTabMenu');
this.dragScrollRef = μƒˆλ‘œμš΄ ElementRef(this.dragScrollDom);
this.dragScroll = μƒˆλ‘œμš΄ DragScroll(this.dragScrollRef, this.renderer);
this.dragScroll.disabled = 거짓;
this.dragScroll.scrollbarHidden = true;
this.dragScroll.yDisabled = true;
this.dragScroll.xDisabled = 거짓;
this.dragScroll.ngOnChanges();
this.renderer.listen(this.dragScrollDo, 'λ§ˆμš°μŠ€λ‹€μš΄', (이벀트) => {
this.dragScroll.onMouseDown(이벀트);
});
~this.renderer.listenGlobal('λ¬Έμ„œ', '마우슀 이동', (이벀트) => {
this.dragScroll.onMouseMove(이벀트);
});
this.renderer.listenGlobal('λ¬Έμ„œ', 'λ§ˆμš°μŠ€μ—…', (이벀트) => {
this.dragScroll.onMouseUp(이벀트);
});~
}

λ§ˆμ§€λ§‰μœΌλ‘œ μ†ŒμŠ€ μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜μ—¬ npm install 에 μ‚¬μš©ν•  수 있게 ν•˜λ©΄ 정말 쒋을 κ²ƒμž…λ‹ˆλ‹€. 맀우 κ°μ‚¬ν•©λ‹ˆλ‹€!

μ•„, 무슨 말씀인지 μ•Œκ² μŠ΅λ‹ˆλ‹€. 였늘 μ–Έμ  κ°€ μ†ŒμŠ€λ₯Ό μ—…λ°μ΄νŠΈν•˜κ³  npm에 μ—…λ‘œλ“œν•˜κ² μŠ΅λ‹ˆλ‹€. λ‹€μ‹œ ν•œ 번 보고해 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

@tommykamkcm , 방금 mouseup 와 mousemove κ°€ λ¬Έμ„œμ— μžˆμ–΄μ•Ό ν•œλ‹€λŠ” 것을 κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ 마우슀λ₯Ό λˆ„λ₯΄κ³  ꡬ성 μš”μ†Œ μ™ΈλΆ€λ‘œ 끌면 μ½˜ν…μΈ κ°€ 이동을 멈μΆ₯λ‹ˆλ‹€.
μ–΄λ–€ 아이디어? μ›ν•˜μ‹ λ‹€λ©΄ ν’€ λ¦¬ν€˜μŠ€νŠΈλ₯Ό μ˜¬λ €μ£Όμ‹œλ©΄ λ³‘ν•©ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” @bfwg , ν•œλ°œ λ¬ΌλŸ¬μ„œμ„œ λ‹€λ₯Έ μ‚¬μš© 사둀에 λŒ€ν•΄ 생각해 λ΄…μ‹œλ‹€.

λ‚΄ μ‚¬μš© μ‚¬λ‘€λŠ” κΈ΄ κ°€λ‘œ 메뉴λ₯Ό λ§ˆμš°μŠ€λ‚˜ μ†κ°€λ½μœΌλ‘œ λ“œλž˜κ·Έ-슀크둀 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. 마우슀 이동에 λ―Όκ°ν•œ HTML5 μŠ¬λΌμ΄λ”λ₯Ό 끌 λ•ŒκΉŒμ§€ λͺ¨λ“  것이 잘 μ§„ν–‰λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν΄λ¦­ν•˜κ³  끌 μˆ˜λŠ” μžˆμ§€λ§Œ μ˜¬λ°”λ₯Έ μœ„μΉ˜μ— λ„λ‹¬ν•œ ν›„μ—λŠ” 핸듀을 놓을 수 μ—†μŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ λ‚˜μ—κ²Œ λ‚΄κ°€ κΈ°λŒ€ν•˜λŠ” 것은) μ‚¬μš©μžμž…λ‹ˆλ‹€. 항상 λ“œλž˜κ·Έ μ˜μ—­ λ‚΄μ—μ„œ λ“œλž˜κ·Έν•©λ‹ˆλ‹€. 즉, 메뉴 b) νŽ˜μ΄μ§€μ˜ λ‹€λ₯Έ ꡬ성 μš”μ†ŒλŠ” ν”ŒλŸ¬κ·ΈμΈμ˜ 영ν–₯을 받지 μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.

그리고 λ‹Ήμ‹ μ˜ μ‚¬μš© μ‚¬λ‘€λŠ” μ•„λ§ˆλ„ μ‚¬μš©μžκ°€ 마우슀λ₯Ό 작고 μ›€μ§μ΄λŠ” ν•œ μ½˜ν…μΈ μ˜ νŠΉμ • 뢀뢄을 μ‰½κ²Œ λ“œλž˜κ·Έν•˜κ³  λ³Ό 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€(λ“œλž˜κ·Έ μ˜μ—­ = document ).

λ‚˜λŠ” 점점 더 λ§Žμ€ μ‚¬μš© 사둀가 μžˆμ„ 것이라고 ν™•μ‹ ν•˜λ©° λ“œλž˜κ·Έ μ˜μ—­μ„ ꡬ성 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“œλŠ” κ²ƒμœΌλ‘œ μƒκ°ν•©λ‹ˆλ‹€ [self| default:document ] μ•„λ§ˆλ„ 갈 길일 κ²ƒμž…λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” @tommykamkcm , μš°λ¦¬κ°€ ν™•μ‹€νžˆ κ³ μΉ  수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. ng-bootstrap의 νƒ­μ…‹μœΌλ‘œ ν…ŒμŠ€νŠΈν•˜κ³  μž¬ν˜„ν•  수 μžˆλŠ”μ§€ ν™•μΈν•˜κ² μŠ΅λ‹ˆλ‹€.
πŸ˜„ κΈ°λ‹€λ €μ£Όμ…”μ„œ λ‹€μ‹œ ν•œ 번 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” @tommykamkcm , 데λͺ¨ μ•± html ν…œν”Œλ¦Ώμ— μ•„λž˜ μ½”λ“œλ₯Ό λ„£μ—ˆμŠ΅λ‹ˆλ‹€.

    <ngb-tabset>
      <ngb-tab title="Simple">
        <ng-template ngbTabContent>
          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth
          master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh
          dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum
          iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>
        </ng-template>
      </ngb-tab>
      <ngb-tab>
        <ng-template ngbTabTitle><b>Fancy</b> title</ng-template>
        <ng-template ngbTabContent>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid.
          <div class="demo-one" drag-scroll drag-scroll-y-disabled="true" scrollbar-hidden="true" >
            <img *ngFor="let image of imagelist" [src]="'assets/img/' + image" />
          </div>
        </ng-template>
      </ngb-tab>
    </ngb-tabset>

λ“œλž˜κ·Έ λͺ©λ‘μ΄ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€. html μ½”λ“œμ— λŒ€ν•œ μžμ„Έν•œ 정보λ₯Ό μ œκ³΅ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

μ•ˆλ…•ν•˜μ„Έμš” @bfw κΈ΄ 침묡에 λŒ€ν•΄ μ£„μ†‘ν•©λ‹ˆλ‹€.

λ‚΄κ°€ ν•˜λ €κ³  ν•˜λŠ” 것은 μ‹€μ œλ‘œ ν”ŒλŸ¬κ·ΈμΈμ„ <ngb-tab> 에 μ μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 ν”ŒλŸ¬κ·ΈμΈμ€ λ‚˜μ€‘μ— <ul role="tablist" ... > 둜 λŒ€μ²΄λ©λ‹ˆλ‹€.
image

@tommykamkcm κ±±μ • λ§ˆμ„Έμš”. ꡬ성 μš”μ†Œκ°€ λ Œλ”λ§λœ ν›„ μ§€μ‹œλ¬Έμ„ μΆ”κ°€ν•˜λ €κ³  ν•©λ‹ˆλ‹€. 내일 μ‹œλ„ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. μ΅œλŒ€ν•œ 빨리 μ—°λ½λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

@tommykamkcm 닡변이 λŠ¦μ–΄μ„œ μ£„μ†‘ν•©λ‹ˆλ‹€. λ‚˜λŠ” ng-tab λ₯Ό μ•½κ°„ 가지고 λ†€μ•˜κ³  이전 κ΅¬ν˜„μ—μ„œμ™€ 같이 μ•½κ°„μ˜ 해킹을 μ‚¬μš©ν•˜μ§€ μ•Šκ³ λŠ” μž‘λ™ν•˜κ²Œ λ§Œλ“€ 수 μ—†μŠ΅λ‹ˆλ‹€.

@bfwg κ±±μ • λ§ˆμ„Έμš”. 해킹이 있고 μž‘λ™ν•˜λŠ” ν•œ λͺ¨λ‘κ°€ κΈ΄μž₯을 ν’€μ–΄μ•Ό ν•©λ‹ˆλ‹€.

해킹을 μˆ˜ν–‰ν•˜λŠ” λ©”μ„œλ“œ, 즉 ν”ŒλŸ¬κ·ΈμΈμ„ DOM μš”μ†Œμ— λ™μ μœΌλ‘œ μ μš©ν•  수 μžˆλ‹€λ©΄ 쒋을 κ²ƒμž…λ‹ˆλ‹€!

μ–΄μ¨Œλ“  μ§€μ›ν•΄μ£Όμ…”μ„œ λ‹€μ‹œ ν•œ 번 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€! 정말 κ°μ‚¬ν•©λ‹ˆλ‹€!

μ•ˆλ…•ν•˜μ„Έμš” @tommykamkcm , μ €λŠ” ν”ŒλŸ¬κ·ΈμΈμ—μ„œ μ›ν•˜λŠ” 것을 μˆ˜ν–‰ν•˜λŠ” attach() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

"DOM μš”μ†Œμ— ν”ŒλŸ¬κ·ΈμΈμ„ λ™μ μœΌλ‘œ 적용"

거의 μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν’€ λ¦¬ν€˜μŠ€νŠΈκ°€ μ€€λΉ„λ˜λ©΄ κ²€ν† ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?
큰 지연에 λŒ€ν•΄ μ£„μ†‘ν•©λ‹ˆλ‹€. 😞

μ•ˆλ…•ν•˜μ„Έμš” @bfww κ±±μ •ν•˜μ§€ λ§ˆμ„Έμš”. λ„μ™€μ£Όμ…”μ„œ 정말 κ°μ‚¬ν•©λ‹ˆλ‹€! μ½”λ“œλ₯Ό 읽기만 ν•˜λ©΄ λͺ¨λ“  것이 μ’‹μ•„ λ³΄μž…λ‹ˆλ‹€! λ‹€μ‹œ ν•œλ²ˆ κ°μ‚¬ν•©λ‹ˆλ‹€!

μ•ˆλ…•ν•˜μ„Έμš” @tommykamkcm / @bfwg 슀크둀이 μžˆλŠ” ngb-tabs용 데λͺ¨λ₯Ό λ“œλ‘­ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

감사 ν•΄μš”

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