μλ νμΈμ, λ°©κΈ Googleμμ μ΄ νλ¬κ·ΈμΈμ μ°Ύμμ΅λλ€.
λ§€μ° κΈ΄ μ¬μ΄νΈ νμ λ©λ΄μ μ λ§ μ μ©νλ€λ κ²μ μμμ΅λλ€. κ·Έλ¬λ λ©λ΄λ ngb-tabset(ng-bootstrapμ κ΅¬μ± μμ μ€ νλ)μΌλ‘ ꡬμΆλμμΌλ©° νλ¬κ·ΈμΈμ tabset κ΅¬μ± μμμ μ½μ νλ λ°©λ²μ μ λͺ¨λ₯΄κ² μ΅λλ€.
μ‘°μΈμ ν΄μ£Όμλ©΄ μ λ§ μ’μ κ² κ°μμ! μ λ§ κ°μ¬ν©λλ€!
@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
λ₯Ό μΆκ°νλ κ²μ
λλ€.
κ·Έλ¦¬κ³ μμλλ‘ <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 , λ§μΉ¨λ΄ μλνμ΅λλ€! κΈ°λ³Έμ μΌλ‘ μλμΌλ‘
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λ¨κ³λ§ νμν©λλ€.
μμ±μ(...) {}
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" ... >
λ‘ λ체λ©λλ€.
@tommykamkcm κ±±μ λ§μΈμ. κ΅¬μ± μμκ° λ λλ§λ ν μ§μλ¬Έμ μΆκ°νλ €κ³ ν©λλ€. λ΄μΌ μλν΄ λ³΄κ² μ΅λλ€. μ΅λν 빨리 μ°λ½λλ¦¬κ² μ΅λλ€.
@tommykamkcm λ΅λ³μ΄ λ¦μ΄μ μ£μ‘ν©λλ€. λλ ng-tab
λ₯Ό μ½κ° κ°μ§κ³ λμκ³ μ΄μ ꡬνμμμ κ°μ΄ μ½κ°μ ν΄νΉμ μ¬μ©νμ§ μκ³ λ μλνκ² λ§λ€ μ μμ΅λλ€.
@bfwg κ±±μ λ§μΈμ. ν΄νΉμ΄ μκ³ μλνλ ν λͺ¨λκ° κΈ΄μ₯μ νμ΄μΌ ν©λλ€.
ν΄νΉμ μννλ λ©μλ, μ¦ νλ¬κ·ΈμΈμ DOM μμμ λμ μΌλ‘ μ μ©ν μ μλ€λ©΄ μ’μ κ²μ λλ€!
μ΄μ¨λ μ§μν΄μ£Όμ μ λ€μ ν λ² κ°μ¬λ립λλ€! μ λ§ κ°μ¬ν©λλ€!
μλ
νμΈμ @tommykamkcm , μ λ νλ¬κ·ΈμΈμμ μνλ κ²μ μννλ attach()
λ©μλλ₯Ό μ¬μ©νκ³ μμ΅λλ€.
"DOM μμμ νλ¬κ·ΈμΈμ λμ μΌλ‘ μ μ©"
κ±°μ μλ£λμμ΅λλ€. ν 리νμ€νΈκ° μ€λΉλλ©΄ κ²ν νμκ² μ΅λκΉ?
ν° μ§μ°μ λν΄ μ£μ‘ν©λλ€. π
μλ νμΈμ @bfww κ±±μ νμ§ λ§μΈμ. λμμ£Όμ μ μ λ§ κ°μ¬ν©λλ€! μ½λλ₯Ό μ½κΈ°λ§ νλ©΄ λͺ¨λ κ²μ΄ μ’μ 보μ λλ€! λ€μ νλ² κ°μ¬ν©λλ€!
μλ νμΈμ @tommykamkcm / @bfwg μ€ν¬λ‘€μ΄ μλ ngb-tabsμ© λ°λͺ¨λ₯Ό λλ‘ν΄ μ£Όμκ² μ΅λκΉ?
κ°μ¬ ν΄μ